条件不退出加入

时间:2013-09-23 15:18:56

标签: sql join

不确定我是否遇到'即时愚蠢',或者这个问题确实很棘手。

所以我有两张桌子。

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匹配。

如果我要替换子查询,等价连接会是什么?

2 个答案:

答案 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