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