我正在尝试使用LEFT JOINS找到不同的孤立的menu_item记录,然后检查NULL值.
下面的查询返回的结果实际上不是孤儿.mitem_id是menu_item表的主键和price_info表的外键.pinfo_id是price_info表和外键orderdetails表的主键.
SELECT DISTINCT mi.mitem_id, descr
FROM menu_item mi
LEFT JOIN price_info pi ON pi.menu_item = mi.mitem_id
LEFT JOIN orderdetails od ON od.price_info = pi.pinfo_id
WHERE od.detail_id IS NULL;
Run Code Online (Sandbox Code Playgroud)
返回的记录之一如下所示:
+----------+------------------+
| mitem_id | descr |
+----------+------------------+
| 926 | Alameda Pale Ale |
+----------+------------------+
Run Code Online (Sandbox Code Playgroud)
我怎么知道它不是一个孤儿是因为当我运行查询时:
SELECT od.detail_id
FROM orderdetails od
INNER JOIN price_info pi ON pi.pinfo_id = od.price_info
INNER JOIN menu_item mi ON mi.mitem_id = pi.menu_item
WHERE mi.mitem_id = 926;
Run Code Online (Sandbox Code Playgroud)
它返回一组记录:
+-----------+
| detail_id |
+-----------+
| 142830 |
| 142876 |
| 143394 |
| 143610 |
Run Code Online (Sandbox Code Playgroud)
为什么它会返回没有孤立的结果?
凯恩是正确的,因为返回的记录不为空。menu_item 和 Price_info 之间的多对多关系使我无法使用 LEFT JOIN WHERE NULL 来查找孤立记录。我最终不得不将查询更改为:
SELECT DISTINCT mi.mitem_id, descr FROM menu_item mi
WHERE mi.mitem_id NOT IN
(SELECT mi.mitem_id FROM menu_item mi
INNER JOIN price_info pi ON pi.menu_item = mi.mitem_id
INNER JOIN orderdetails od ON od.price_info = pi.pinfo_id)
Run Code Online (Sandbox Code Playgroud)