使用子查询比较两个表?
Comparing two tables using sub query ?
我可以使用以下查询比较两个表的缺失数据
SELECT S.DEVID,S.INPUTID,S.PRI,S.CCID FROM [DEVICE-SECURITY].DBO.DEVICE_LINK S
WHERE HID = 4
EXCEPT
SELECT T.DEVID,T.INPUTID,T.PRI,T.CCID FROM DEVICE-CONFIG.DBO.DEVICE_LINK T
WHERE HID = 1
The above query returns four rows which are not present in my source
table
现在我正在尝试使用子查询来获得相同的结果
SELECT S.DEVID,S.INPUTID,S.PRI,S.CCID ,
CASE WHEN S.HID = '4' THEN '1' END AS HID
FROM [DEVICE-SECURITY].DBO.DEVICE_LINK S
WHERE S.HID= 4 AND NOT EXISTS (
SELECT T.DEVID,T.INPUTID,T.PRI,T.CCID FROM DEVICE-CONFIG.DBO.DEVICE_LINK T
WHERE T.HID = 1 )
It returns no rows .
如何使用子查询获得同样的结果
等效的不存在查询是
SELECT S.DEVID,S.INPUTID,S.PRI,S.CCID FROM [DEVICE-SECURITY].DBO.DEVICE_LINK S
WHERE HID = 4
AND NOT EXISTS (
SELECT 1 FROM DEVICE-CONFIG.DBO.DEVICE_LINK T
WHERE HID = 1
AND T.DEVID = S.DEVID AND T.INPUTID = S.INPUTID
AND T.PRI = S.PRI AND T.CCID = S.CCID
)
你有两个选择
你可以做一个 not in 过滤器,这样子查询就不必连接到外部
SELECT S.DEVID,S.INPUTID,S.PRI,S.CCID , CASE WHEN S.HID = '4' THEN '1' END AS HID FROM [DEVICE-SECURITY].DBO.DEVICE_LINK S WHERE S.HID= 4 AND S.DEVID+S.INPUTID+S.PRI+S.CCID NOT in ( SELECT T.DEVID+T.INPUTID+T.PRI+T.CCID FROM DEVICE-CONFIG.DBO.DEVICE_LINK T WHERE T.HID = 1 )
或者您可以保持不存在,并通过您要比较的所有字段将子查询连接到主查询
SELECT S.DEVID,S.INPUTID,S.PRI,S.CCID , CASE WHEN S.HID = '4' THEN '1' END AS HID FROM [DEVICE-SECURITY].DBO.DEVICE_LINK S WHERE S.HID= 4 AND NOT exists ( SELECT 1 FROM DEVICE-CONFIG.DBO.DEVICE_LINK T WHERE T.HID = 1 and T.DEVID+T.INPUTID+T.PRI+T.CCID=S.DEVID+S.INPUTID+S.PRI+S.CCID)
我可以使用以下查询比较两个表的缺失数据
SELECT S.DEVID,S.INPUTID,S.PRI,S.CCID FROM [DEVICE-SECURITY].DBO.DEVICE_LINK S
WHERE HID = 4
EXCEPT
SELECT T.DEVID,T.INPUTID,T.PRI,T.CCID FROM DEVICE-CONFIG.DBO.DEVICE_LINK T
WHERE HID = 1
The above query returns four rows which are not present in my source table
现在我正在尝试使用子查询来获得相同的结果
SELECT S.DEVID,S.INPUTID,S.PRI,S.CCID ,
CASE WHEN S.HID = '4' THEN '1' END AS HID
FROM [DEVICE-SECURITY].DBO.DEVICE_LINK S
WHERE S.HID= 4 AND NOT EXISTS (
SELECT T.DEVID,T.INPUTID,T.PRI,T.CCID FROM DEVICE-CONFIG.DBO.DEVICE_LINK T
WHERE T.HID = 1 )
It returns no rows .
如何使用子查询获得同样的结果
等效的不存在查询是
SELECT S.DEVID,S.INPUTID,S.PRI,S.CCID FROM [DEVICE-SECURITY].DBO.DEVICE_LINK S
WHERE HID = 4
AND NOT EXISTS (
SELECT 1 FROM DEVICE-CONFIG.DBO.DEVICE_LINK T
WHERE HID = 1
AND T.DEVID = S.DEVID AND T.INPUTID = S.INPUTID
AND T.PRI = S.PRI AND T.CCID = S.CCID
)
你有两个选择
你可以做一个 not in 过滤器,这样子查询就不必连接到外部
SELECT S.DEVID,S.INPUTID,S.PRI,S.CCID , CASE WHEN S.HID = '4' THEN '1' END AS HID FROM [DEVICE-SECURITY].DBO.DEVICE_LINK S WHERE S.HID= 4 AND S.DEVID+S.INPUTID+S.PRI+S.CCID NOT in ( SELECT T.DEVID+T.INPUTID+T.PRI+T.CCID FROM DEVICE-CONFIG.DBO.DEVICE_LINK T WHERE T.HID = 1 )
或者您可以保持不存在,并通过您要比较的所有字段将子查询连接到主查询
SELECT S.DEVID,S.INPUTID,S.PRI,S.CCID , CASE WHEN S.HID = '4' THEN '1' END AS HID FROM [DEVICE-SECURITY].DBO.DEVICE_LINK S WHERE S.HID= 4 AND NOT exists ( SELECT 1 FROM DEVICE-CONFIG.DBO.DEVICE_LINK T WHERE T.HID = 1 and T.DEVID+T.INPUTID+T.PRI+T.CCID=S.DEVID+S.INPUTID+S.PRI+S.CCID)