我有
表商店 - > 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
相同的结果集。
答案 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