[英]How to Loop Through Specific rows in T-SQL
我有一个包含2列的表-server_name,status_name。 我正在尝试定位特定的服务器/状态组合
例:
server_name status_name
server01 decommissioned
server01 archive
server02 decommissioned
server02 production
server03 decommissioned
server03 test
server04 decommissioned
server04 archive
我只想返回退役/归档的服务器/状态组合
结果:
server_name status_name
server01 decommissioned
server01 archive
server04 decommissioned
server04 archive
我尝试使用游标,但是因为至少一组status_name已停用,所以它返回所有行。
有什么方法可以只检索我要查找的对status_name吗?
CREATE TABLE TEST (
SERVER_NAME nvarchar(50),
STATUS_NAME nvarchar(50)
)
INSERT INTO TEST (SERVER_NAME, STATUS_NAME)
VALUES(N'SERVER01', N'DECOMMISSIONED'), (N'SERVER01', N'ARCHIVE'),
(N'SERVER02', N'DECOMMISSIONED'), (N'SERVER02', N'PRODUCTION'),
(N'SERVER03', N'DECOMMISSIONED')
,(N'SERVER03', N'ARCHIVE'), (N'SERVER04', N'DECOMMISSIONED'),
(N'SERVER04', N'TEST')
DECLARE DECOM_Cursor CURSOR FOR
SELECT [SERVER_NAME],
[STATUS_NAME]
FROM TEST
WHERE [STATUSNAME] IN ('DECOMMISSIONED', 'ARCHIVE');
OPEN DECOM_Cursor;
FETCH NEXT FROM DECOM_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM DECOM_Cursor;
END;
CLOSE DECOM_Cursor;
DEALLOCATE DECOM_Cursor;
GO
SELECT *
FROM TableName t
WHERE EXISTS (SELECT 1
FROM TableName
WHERE t.Server_name = Server_Name
AND Status_name = 'decommissioned')
AND EXISTS (SELECT 1
FROM TableName
WHERE t.Server_name = Server_Name
AND Status_name = 'archive')
我知道这个问题已经回答了,但是我的回答比M.Ali的回答要简单一些。 我没有每个值的子查询。 其次,因为它不必两次访问表(每个子查询一次),所以它的性能似乎比M.Ali的解决方案要好。 当我对他进行查询时,我得到的执行时间更少,逻辑读取更少。 当然,您的完整数据集可能有所不同,但是我建议您尝试查询一下。
SELECT *
FROM Test A
CROSS APPLY (
SELECT COUNT(STATUS_NAME)
FROM Test B
WHERE A.SERVER_NAME = B.SERVER_NAME
AND B.STATUS_NAME IN ('DECOMMISSIONED', 'ARCHIVE')
GROUP BY B.SERVER_NAME
) CA(match_cnt)
WHERE match_cnt = 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.