当前位置: 首页 > 面试题库 >

LEFT JOIN返回与INNER JOIN相同的结果

张浩阔
2023-03-14
问题内容

我有一张桌子(灌木丛),上面有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

谢谢!


问题答案:

因为您没有使用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


 类似资料:
  • 文档: 操作: 合作伙伴: HQL(“INCASAT”=“兑现”,“VANDUT”=“出售”):

  • 当我执行普通Select时,返回正确的结果,但当我执行Select for DB uptime时,它始终返回相同的第一个结果。我确实检查了Postgres日志,我看到select被执行了。

  • 然后mocked repository返回传递给它的内容,我可以轻松地测试它。 有什么想法吗?如何强制mockito返回?

  • 问题内容: 我在Mockito中有这个: 该方法应始终返回一个新实例,但它会返回两次相同的引用。 为什么该方法不返回新值? 问题答案: 该方法将始终返回传递给它的内容。该代码是在调用之前执行的。然后将创建的内容传递给。因此有一个绝对的实例而不是创建机制。 如果需要提供新实例,请使用thenAnswer

  • 我正在使用GenericRequest(内置jsonrequest的扩展)对接收json对象并返回一个字符串的服务器进行REST调用,如果json对象已经存在,则为“0”,否则为非零字符串。 然而,使用下面的代码,无论我发送了什么,我总是得到一个“0”回来。 在Postman中进行测试时,给定输入,如:{“Email”:“DLEE23122”,“Password”:“1234”,“UserName

  • 我正在尝试从product表中获取所有记录,这些记录是唯一的,但我使用leftjoin添加第二个表,其中包含这些产品的图像,但当我这样做时,它会多次返回一些产品,因为一些产品有一个或多个图像。我如何在product_images表上使用限制来确保它只得到1个图像而不是全部。下面的例子不起作用,那么这可能吗?

  • 有一个InfiniteScrollListener,在该侦听器中,在方法中,我计算可见项计数和总计项计数,以检查是否应该加载新项。当totalItemCount和visibleItemCount相同时,会导致无限循环的加载。侦听器与我的另一个或作为父级的侦听器一起工作得很好。我想保持这种结构,因为客户不会接受改变。 我在一个活动中有一个片段,它的布局如下所示

  • 我有以下代码: 问题:是否可以替换 d - *我对这个问题的标题不太清楚-如果有问题,请编辑。 谢啦