Gop*_*opi 7 sql t-sql sql-server sql-server-2005
当给出两组时
s1 = {a,b,c,d} s2 = {b,c,d,a}
(即)
TableA
Item
a
b
c
d
TableB
Item
b
c
d
a
Run Code Online (Sandbox Code Playgroud)
如何编写Sql查询以显示"tableA和tableB中的元素相等".[不使用SP或UDF]
产量
Elements in TableA and TableB contains identical sets
Run Code Online (Sandbox Code Playgroud)
使用:
SELECT CASE
WHEN COUNT(*) = (SELECT COUNT(*) FROM a)
AND COUNT(*) = (SELECT COUNT(*) FROM b) THEN 'Elements in TableA and TableB contains identical sets'
ELSE 'TableA and TableB do NOT contain identical sets'
END
FROM (SELECT a.col
FROM a
INTERSECT
SELECT b.col
FROM b) x
Run Code Online (Sandbox Code Playgroud)
测试:
WITH a AS (
SELECT 'a' AS col
UNION ALL
SELECT 'b'
UNION ALL
SELECT 'c'
UNION ALL
SELECT 'd'),
b AS (
SELECT 'b' AS col
UNION ALL
SELECT 'c'
UNION ALL
SELECT 'd'
UNION ALL
SELECT 'a')
SELECT CASE
WHEN COUNT(*) = (SELECT COUNT(*) FROM a)
AND COUNT(*) = (SELECT COUNT(*) FROM b) THEN 'yes'
ELSE 'no'
END
FROM (SELECT a.col
FROM a
INTERSECT
SELECT b.col
FROM b) x
Run Code Online (Sandbox Code Playgroud)
这样的东西,使用FULL JOIN:
SELECT
CASE
WHEN EXISTS (
SELECT * FROM s1 FULL JOIN s2 ON s1.Item = s2.Item
WHERE s1.Item IS NULL OR s2.Item IS NULL
)
THEN 'Elements in tableA and tableB are not equal'
ELSE 'Elements in tableA and tableB are equal'
END
Run Code Online (Sandbox Code Playgroud)
这对第一个非比赛凭借短路,与需要2个每个表的完全扫描其他解决方案(曾经为COUNT(*),一旦加入/ INTERSECT).
估计成本明显低于其他解决方案.