从表C中选择元素不与表B中表A中的元素配对

时间:2015-07-24 11:05:51

标签: sql sql-server join

我有

表商店 - > STOREID

table store_items - > storeid,itemid

表项 - >的itemid

我想选择每家商店缺少的商品。我怎么能得到那些?

到目前为止,我已经:

SELECT ts.storeid, ti.itemid
FROM stores ts,items ti
LEFT JOIN store_items tsi ON ts.storeid = tsi.storeid AND ti.itemid = tsi.itemid 
WHERE tsi.itemid IS NULL

但我得到的只是:

Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "ts.storeid" could not be bound.

尝试从条件中删除别名:

SELECT ts.storeid, ti.itemid
FROM stores ts,items ti
LEFT JOIN store_items tsi ON storeid = tsi.storeid AND ti.itemid = tsi.itemid 
WHERE tsi.itemid IS NULL

执行时没有错误,但为我提供了与使用ON ti.itemid = tsi.itemid而不是ON ts.storeid = tsi.storeid AND ti.itemid = tsi.itemid相同的结果集。

2 个答案:

答案 0 :(得分:1)

不要混合使用旧式连接和显式连接。实际上,只需遵循一个简单的规则:从不from子句中使用逗号。

在这种情况下,您需要cross join

SELECT ts.storeid, ti.itemid
FROM stores ts cross join
     items ti left join
     store_items tsi
     ON ti.itemid = tsi.itemid and ts.storeid = tsi.storeid
WHERE tsi.itemid IS NULL;

逗号的问题是MySQL(和ANSI SQL)坚持的范围规则。逗号阻止from子句的下一部分知道第一部分中出现的别名。 cross join解决了这个问题。

答案 1 :(得分:0)

你在这里:

SELECT ts.storeid, ti.itemid
FROM stores ts, items ti
where not exists(
    select 1 from store_items tsi
    where
        tsi.itemid = ti.itemid and
        tsi.storeid = ts.storeid
)
order by ts.storeid, ti.itemid