繁体   English   中英

如何在T-SQL中遍历特定行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM