我有两张桌子:
表:#a
id |命名
10 |一个
20 | b
30 | ç
40 | d
50 | ë
表:#b
id |名称
10 |一个
30 |一个
50 |一个
我想要#b
中没有的所有#a表ID以下查询有效:
select * from #a as a
where not exists(select * from #b as b where a.id = b.id)
但我无法理解为什么以下查询不起作用
select * from #a as a
where exists(select * from #b as b where a.id <> b.id)
答案 0 :(得分:2)
为什么不存在表达式不能提供正确的输出
第一个查询确实产生了正确的结果:选择A中的所有记录,其中B
中没有适当的匹配但第二个在逻辑上是不同的。
看着:
;with A(id,name) as
(
select 10,'a' UNION ALL
select 20,'b' UNION ALL
select 30,'c' UNION ALL
select 40,'d' UNION ALL
select 50,'e'
) ,B(id,name) as
(
select 10,'a' UNION ALL
select 30,'a' UNION ALL
select 50,'a'
)
select * from a as a
where exists(select * from b as b where a.id <> b.id)
对于a
中的每条记录,请显示该记录是否存在来自b
且不匹配 ID的记录。
因此,对于10,a
(a
),来自B
的{{1}}不是id
的ARE(!)记录,因此确实 YIELDS 10
(来自10,a
)!
现在 - 你看到了问题吗?
答案 1 :(得分:1)
这两个查询不同,因此结果不同。
1)第一个查询显示a
中not exists
b
中a.id = b.id
的所有行a
2)第二个查询显示来自exists
的所有行,b
(a.id <> b.id
)中至少有一行(;WITH
a AS ( SELECT * FROM (VALUES (10, 'a'),(20, 'b'),(30, 'c'),(40, 'd'),(50, 'e')) x(id, name) ),
b AS ( SELECT * FROM (VALUES (10, 'aa'),(30, 'aaa'),(50, 'aaaa')) x(id, name) )
SELECT *,
CASE WHEN not exists(select * from b where a.id = b.id) THEN 1 ELSE 0 END AS Test1_NOT_EXISTS,
CASE WHEN exists(select * from b where a.id <> b.id) THEN 1 ELSE 0 END AS Test2_EXISTS,
(select top(1) b.id from b where a.id <> b.id) AS Test2_EXISTS_OneDifferentIDFromB
FROM a
)。
/*
id name Test1_NOT_EXISTS Test2_EXISTS Test2_EXISTS_OneDifferentIDFromB
----------- ---- ---------------- ------------ --------------------------------
10 a 0 1 30
20 b 1 1 10
30 c 0 1 10
40 d 1 1 10
50
输出:
import json
JSON_FILE = "/tmp/json.json"
with open(JSON_FILE) as infile:
print infile
print '\n type of infile is \n', infile
data = json.load(infile)
print data
str_data = json.dumps(data)
print str_data