[英]What's the best way to get the common and different rows between two tables in SQL Server?
我正在做一個比較兩個設備的項目。 我想了解差異和共同點,讓我們說這些設備的可用 3g 技術同時保持順序,共同點將放在一個跨度中,而其余部分將是純文本。 我嘗試了以下方法:
SELECT n.name AS modif, n.name FROM device_networks
JOIN networks n ON n.id = network_id
JOIN network_technologies nt ON nt.id = n.tech_id
WHERE G=3 AND device_id = 77
AND n.name NOT IN(
SELECT n.name FROM device_networks
JOIN networks n ON n.id = network_id
JOIN network_technologies nt ON nt.id = n.tech_id
WHERE G=3 AND device_id = 10
INTERSECT
SELECT n.name FROM device_networks
JOIN networks n ON n.id = network_id
JOIN network_technologies nt ON nt.id = n.tech_id
WHERE G=3 AND device_id = 77
)
UNION
SELECT CONCAT('<span class=''dif''>', n.name,'</span>') AS modif, n.name FROM device_networks
JOIN networks n ON n.id = network_id
JOIN network_technologies nt ON nt.id = n.tech_id
WHERE G=3 AND device_id = 77
AND n.name IN(
SELECT n.name FROM device_networks
JOIN networks n ON n.id = network_id
JOIN network_technologies nt ON nt.id = n.tech_id
WHERE G=3 AND device_id = 10
INTERSECT
SELECT n.name FROM device_networks
JOIN networks n ON n.id = network_id
JOIN network_technologies nt ON nt.id = n.tech_id
WHERE G=3 AND device_id = 77
)
ORDER BY name DESC
但它似乎太大了,這讓我覺得有一種不同的方法可以解決它。 我將為子查詢使用一個函數,但如果有更好的方法,請告訴我! 謝謝。
編輯:
這是輸出
這是架構的一部分
我仍然不能 100% 確定上述查詢的使用,但可以使用 CTE 來縮短它
;WITH Intersected_CTE AS(
SELECT
n.name
FROM
device_networks
JOIN networks n ON n.id = network_id
JOIN network_technologies nt ON nt.id = n.tech_id
WHERE
G=3
AND device_id = 10
INTERSECT
SELECT
n.name
FROM
device_networks
JOIN networks n ON n.id = network_id
JOIN network_technologies nt ON nt.id = n.tech_id
WHERE
G=3
AND device_id = 10
)
SELECT n.name AS modif, n.name FROM device_networks
JOIN networks n ON n.id = network_id
JOIN network_technologies nt ON nt.id = n.tech_id
WHERE G=3 AND device_id = 77
AND n.name NOT IN(
SELECT
n.name
FROM
Intersected_CTE
)
UNION
SELECT CONCAT('<span class=''dif''>', n.name,'</span>') AS modif, n.name FROM device_networks
JOIN networks n ON n.id = network_id
JOIN network_technologies nt ON nt.id = n.tech_id
WHERE G=3 AND device_id = 77
AND n.name IN(
SELECT
n.name
FROM
Intersected_CTE
)
ORDER BY name DESC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.