开发者社区> 问答> 正文

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

-1

我正在做一个比较两个设备的项目。我想既得到差异,又得到共同点,比如说在保持顺序的情况下,上述设备的可用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

但是它似乎太大了,这使我认为还有另一种处理方法。我将为子查询使用一个函数,但是如果有更好的方法,请告诉我!谢谢。

展开
收起
祖安文状元 2020-01-04 15:53:46 483 0
1 条回答
写回答
取消 提交回答
  • 我仍然不确定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
    
    2020-01-04 15:54:00
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载