Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 在SQL Server中,获取两个表之间的公共行和不同行的最佳方法是什么?_Html_Asp.net_Sql Server - Fatal编程技术网

Html 在SQL Server中,获取两个表之间的公共行和不同行的最佳方法是什么?

Html 在SQL Server中,获取两个表之间的公共行和不同行的最佳方法是什么?,html,asp.net,sql-server,Html,Asp.net,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_i

我正在做一个比较两台设备的项目。我想了解这些设备的区别和共同点,比如说,这些设备的可用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

如果不知道表的模式以及您期望的输出,我们就不可能帮助您。考虑提供你的数据和输出的例子。@ IKEnEMP我增加了输出和模式,但是我不知道它会如何帮助,我想在两个表之间同时获得不同的和公共的行。result@Squirrel我得到的是预期的结果,我想知道是否有更好的方法来获得所说的结果。是的,我把交叉点放在一个函数中,因为我对有另一种方法失去了希望。谢谢你的帮助!