0

不确定我是否被“即时愚蠢”所困扰,或者这个查询是否真的很棘手。

所以我有两张桌子。

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 中 B 中的任何辅助工具,但该辅助工具没有匹配的国家 ITALY

一个简单的子查询可以是:

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')

在上面的例子中,如果表Aaid=1,2,3,4 并且表B只有两条记录(2-ITALY, 2-JAPAN),我应该只得到1,3,4结果。但如果这两条记录是(2-USA, 2-JAPAN),结果就会是1,2,3,4

以下左联接将不起作用。

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) 

因为如果 B 中的记录是 ,这仍然会2-JAPAN被视为匹配 (2-ITALY , 2-JAPAN)

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

4

2 回答 2

1

试试这个。它将匹配 country = ITALY,然后只返回那些不匹配的行(例如,country 为空)。如果您需要不同的辅助值,您显然可以在 select 语句和相关列中添加不同的值。

select * 
from 
    a
    left join b
        on  a.aid = b.aid
            and b.country = 'ITALY'
where
    b.country is null
于 2013-09-23T15:25:01.973 回答
1

我认为您的错误在于使用<> 'ITALY'而不是= 'ITALY'. 可以理解的错误,因为如果 ITALY 存在,您希望排除记录,但是双重否定表示肯定,并且您已经在 中获得否定where B.aid is null,所以您真正想要的是找到值为 ITALY 的行然后排除这些匹配项从结果来看。

select A.aid from A
left join B on A.aid = B.aid and b.country = 'ITALY'
where b.aid is null
于 2013-09-23T15:27:14.183 回答