LEFT JOIN取左表中的所有行,而不考虑联接条件

时间:2018-08-08 20:59:24

标签: sql oracle join oracle-sqldeveloper

我正在尝试进行左连接,以便即使这些行的连接条件不成立,也可以从左表中获取所有行。

示例:“援助下方” =“出价”,但表B仅包含3个身份

enter image description here

我正在使用的查询仅给出联接条件为true的行。即使Join条件不成立,有没有办法从左表获取所有行?

我的查询

SELECT Table1.Aid,
       Table2.Bid,
       Table2.Issueid
  FROM Table1
       LEFT JOIN Table2 ON Table1.Aid = Table2.Bid;

 WHERE Table2.Issueid IN (
    'a',
    'b'
)

4 个答案:

答案 0 :(得分:3)

将您的WHERE移至您的ON(加入谓词):

SELECT Table1.Aid, Table2.Bid, Table2.IssueId
FROM Table1 LEFT JOIN Table2
ON Table1.Aid = Table2.Bid
   AND Table2.IssueId IN ('a','b');

在右侧表格上进行过滤的WHERE实际上使您的LEFT JOIN变成了INNER JOIN。它将滤除NULL行。

请记住,这将返回NULL行的Table2.Bid = 3,因为它不满足Table2.IssueId IN ('a','b')的条件。

答案 1 :(得分:0)

我很惊讶您的查询运行。您应该有一个ON子句:

SELECT Table1.Aid, Table2.Bid, Table2.IssueId
FROM Table1 LEFT JOIN
     Table2
     ON Table1.Aid = Table2.Bid;

对于修改后的查询,您仍然需要将条件移至ON子句中:

SELECT Table1.Aid, Table2.Bid, Table2.IssueId
FROM Table1 LEFT JOIN
     Table2
     ON Table1.Aid = Table2.Bid AND Table2.IssueId IN ('a','b');

答案 2 :(得分:0)

我认为在这种情况下,您需要一个left outer join子句的WHERE

例如:

SELECT Table1.Aid, Table2.Bid, Table2.IssueId
FROM Table1 
LEFT OUTER JOIN Table2 ON Table1.Aid = Table2.Bid 
                       AND Table2.IssueId IN ('a','b')

答案 3 :(得分:0)

根据您想要的结果

  ON Table1.Aid = Table2.Bid 
  AND Table2.IssueId IN ('a','b') 

不会给您想要的结果。具体来说,第3行将是

3, null, null 

不是

3, 3, null

如果这是您真正想要的,那么简单地通过完全没有任何where子句的左联接即可得到。