不确定我是否遇到'即时愚蠢',或者这个问题确实很棘手。
所以我有两张桌子。
table A (aid,b,c) - aid unique
table B (aid, country) - aid not unique
(eg: (aid-country) = 2-ITALY, 2-JAPAN etc.)
我正在尝试使用联接来查找 A中没有B的所有辅助工具,或A中的任何辅助工具,但是援助没有匹配的国家/地区意大利
一个简单的子查询可能是:
select * from A where aid is not in (select aid from B where country = 'ITALY')
select * from A where not exists (select aid from B where country = 'ITALY')
在上面的例子中,如果表格 A 有aid=1,2,3,4
且表格 B 只有两个记录(2-ITALY, 2-JAPAN)
,我应该只获得{{1} }} 作为结果。但如果两个记录为1,3,4
,则结果为(2-USA, 2-JAPAN)
。
以下左连接无效。
1,2,3,4
如果B中的记录为select *
from A left join B on A.aid=B.aid
where b.country<>ITALY AND B.aid is null
select *
from A left join B on A.aid=B.aid
where ( B.aid is null) .
OR (where A.aid=B.aid and b.country<>ITALY)
,则仍会看到2-JAPAN
匹配。
如果我要替换子查询,等价连接会是什么?
答案 0 :(得分:1)
试试这个。它将匹配country = ITALY,然后仅返回那些不匹配的行(例如,country为null)。如果您需要不同的辅助值,您显然可以在select语句和相关列中添加一个distinct。
select *
from
a
left join b
on a.aid = b.aid
and b.country = 'ITALY'
where
b.country is null
答案 1 :(得分:1)
我认为您的错误是使用<> 'ITALY'
代替= 'ITALY'
。可以理解的错误,因为如果意大利存在,你想要排除记录,但是双重否定会产生积极影响,而你已经在where B.aid is null
中得到了负数,所以你真正想要的是找到值的行是意大利,然后从结果中排除这些匹配。
select A.aid from A
left join B on A.aid = B.aid and b.country = 'ITALY'
where b.aid is null