假设我有两个表。项目和存储。
它们之间通过项目ID相互关联。
我要列出的每个项目,在存储中都没有关系
我有一种直觉,我的陈述可能比这简单得多:
SELECT item.name,storage.stuff
FROM item
LEFT JOIN storage ON storage.item_id=item.id
WHERE storage.stuff IS NULL
GROUP BY item.id
是否有一种方法可以将LEFT JOIN替换为另一个,所以我退回了没有任何内容的项目?
(我实际上想保留填充字段的返回值,即使它始终为NULL,因为我有一个查询函数通过多种方式列出项目,通过ajax为客户端提供服务,并且我不想在那里检查是否字段是否存在,提取部分均不存在
Table Item id name 1 a 2 b 3 c 4 d Table Storage item_id stuff 1 this 1 that 2 this
所需结果:
item_id item_name stuff 3 c NULL 4 d NULL
答案 0 :(得分:2)
您无需在查询中使用Group By
,因为您正在获取storage
表中没有匹配项的情况。您的Group BY
也不是有效的ANSI SQL,因为在Select
子句中将提取未聚合的列/未按组的列。
SELECT item.id, item.name, storage.stuff
FROM item
LEFT JOIN storage ON storage.item_id=item.id
WHERE storage.stuff IS NULL
答案 1 :(得分:0)
对此有更多方法。
左联接方法
查询
SELECT
Item.id
, Item.name
, Storage.stuff
FROM
Item
LEFT JOIN
Storage
ON
Storage.item_id = Item.id
WHERE
Storage.stuff IS NULL
不存在方法
查询
SELECT
Item.id
, Item.name
, NULL AS stuff
FROM
Item
WHERE
NOT EXISTS (
SELECT
1
FROM
Storage
WHERE
Storage.item_id = Item.id
)
NOT IN方法
查询
SELECT
Item.id
, Item.name
, NULL AS stuff
FROM
Item
WHERE
Item.id NOT IN (
SELECT
Storage.item_id
FROM
Storage
WHERE
Storage.item_id = Item.id
)