簡體   English   中英

在 SQL Server 中獲取兩個表之間的公共行和不同行的最佳方法是什么?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM