Html 在SQL Server中,获取两个表之间的公共行和不同行的最佳方法是什么?
我正在做一个比较两台设备的项目。我想了解这些设备的区别和共同点,比如说,这些设备的可用3g技术在保持秩序的同时,共同点将放在一个范围内,而其余的将是纯文本。 我尝试了以下方法: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
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我得到的是预期的结果,我想知道是否有更好的方法来获得所说的结果。是的,我把交叉点放在一个函数中,因为我对有另一种方法失去了希望。谢谢你的帮助!