mysql - LEFT OUTER JOIN 和 INNER JOIN 使总行数相等
问题描述
我有一个生产者和产品表。我正在尝试编写 2 个查询,有产品的生产者和没有产品的生产者。
每个查询返回的行应该加起来就是生产者表中的总行数,但我的代码不是这样。两个查询的总和为 819,但 Producer 表中只有 766 行。重复从哪里来?
我的 JOIN 做错了什么?
PRODUCER TABLE
+------+--------+------+------+
| producerID | producerName |
+------+--------+------+------+
| 123 | Toys R Us |
| 234 | GameStop |
| 345 | Amazon |
+------+--------+------+------+
PRODUCT TABLE
+------+--------+------+--------+------+
| productID | productName | producerID |
+------+--------+------+--------+------+
| 1 | Mega Man | 123 |
| 2 | Lemmings | 234 |
| 3 | Mario Kart | 234 |
+------+--------+------+--------+------+
/*STORES CARRYING Products*/
/*This query returns 169*/
SELECT producerName, pt.producerID, productName
FROM Product pt
INNER JOIN Producer pd ON pt.producerID = pd.producerID
/*STORES NOT CARRYING Products*/
/*This query returns 650 */
SELECT producerName, pt.producerID, productName
FROM Producer pd
LEFT OUTER JOIN Product pt ON pt.producerID = pd.producerID
WHERE pt.producerID IS NULL
/*Count all rows returns 766*/
SELECT COUNT(*) FROM Producer
解决方案
您可以使用Subquery而不是使用 Join 。
例如,此查询将返回所有拥有产品的生产者。
SELECT *
FROM Producer
WHERE producerID IN (SELECT producerID FROM Products)
此查询将返回所有没有产品的生产者。
SELECT *
FROM Producer
WHERE producerID NOT IN (SELECT producerID FROM Products)
推荐阅读
- excel - 如何计算特定范围内仅包含数字的单元格数量,忽略文本和空单元格
- javascript - 为什么只更新第一行的函数效果?
- bash - 我的 PyCharm 在 Linux Mint 中以 /usr/bin/sh 而不是 /bin/bash 开头,并且不手动更改
- javascript - 如果任何元素内的所有 html 元素都被隐藏,则隐藏特定的 html 元素
- javascript - ionic 4 ion-item 在同一行显示数据。如果数据太长,则只显示能显示的数据
- java - 在本机应用程序中膨胀类 com.jjoe64.graphview.GraphView 时出错
- bash - complete -E 完成设置
- hyperledger-fabric - 在 Hyperledger Fabric 2.0 错误中实现私有数据收集
- vb.net - Directory.Enumerate Files - 需要通过严格的文件扩展名过滤
- paypal - 您能否为过去(无 IPN)交易生成新的 PayPal IPN?