如何在T-SQL中循环特定行

时间:2015-05-06 21:09:36

标签: sql sql-server tsql

我有一个包含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

我想只返回decommissioned / 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

2 个答案:

答案 0 :(得分:1)

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')

答案 1 :(得分:0)

我知道这个问题已经得到了回答,但我的答案比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