我有一张桌子(灌木丛),上面有1600个独特的物品。第二张桌子,奖金超过一百万。我运行INNER JOIN并获得65个匹配项:
SELECT a.`BW Parent Number` , a.`Vendor Name`, b.`Parent Supplier Name` FROM `scrubs` AS a JOIN pdwspend AS b ON a.`BW Parent Number` = b.`Child Supplier ID` WHERE a.`year` =2014 AND b.`BU ID` = 'BU_1' AND b.version LIKE '%GOV%' GROUP BY a.`BW Parent Number`
然后,我运行一个LEFT OUTER JOIN,得到相同的65个结果:
SELECT a.`BW Parent Number` , a.`Vendor Name`, b.`Parent Supplier Name` FROM `scrubs` AS a LEFT OUTER JOIN pdwspend AS b ON a.`BW Parent Number` = b.`Child Supplier ID` WHERE a.`year` =2014 AND b.`BU ID` = 'BU_1' AND b.version LIKE '%GOV%' GROUP BY a.`BW Parent Number`
为什么不从左侧表中获取所有行,并为b下不匹配的行显示NULL。Parent Supplier Name?
Parent Supplier Name
谢谢!
因为您没有使用on子句。更改为:
SELECT a.`BW Parent Number`, a.`Vendor Name`, b.`Parent Supplier Name` FROM scrubs AS a LEFT OUTER JOIN pdwspend AS b ON a.`BW Parent Number` = b.`Child Supplier ID` and b.`BU ID` = 'BU_1' AND b.`version` LIKE '%GOV%' WHERE a.`year` = 2014
同样,分组依据也没有任何意义。如果您正在汇总某些内容,则可以使用group by子句。
根据您对重复行的评论,这可能是因为名为“ pdwspend”的表的每个“子供应商ID”都有多个行。这是该表上您要与之关联的“ scrubs”表的唯一字段。因此,是的,对于pdwspend上的每个匹配行,您将拥有与第二张表相同的行(该表上可能还有其他列,因此它们实际上不是“重复的”行,您只是没有选择足以说明的列)。
因为您只对选择的列数感兴趣,并且不希望基于这些列“重复”行,所以可以尝试使用以下方法来区分:
(您在注释中输入的查询中出现错误的原因是,因为内联视图(from子句中的子查询)未选择“父供应商名称”字段,所以是的,在该字段中不存在内联视图,因为您没有将其添加到该内联视图的选择列表中。
select a.`BW Parent Number`, a.`Vendor Name`, b.`Parent Supplier Name` from scrubs a left join ( select distinct `Child Supplier ID`, `Parent Supplier Name` from pdwspend where `BU ID` = 'BU_1' and `version` LIKE '%GOV') b on a.`BW Parent Number` = b.`Child Supplier ID` where a.`year` = 2014