带标志联接,不需要联接表中的关联行

时间:2018-08-29 04:15:40

标签: mysql sql join

我有table1,其中包含以下列:

  • t1_id(主键,自动递增)
  • row_1
  • row_2
  • open_1可以为0或1。

我有table2,其中包含以下列:

  • t1_idtable1.t1_id的外键)
  • row_1可以为0或1
  • 其他一些列

生成表时,如果没有为table2生成任何列,则table1.open_1 = 1。

因此,如果open_1为1,则t1_id中将没有行具有相同的table2键,否则table2中将有1个或更多行具有相同的t1_id

我想在其中{strong>其他为真的情况下检索table1.row_1, table1.row_2

  • open_1是1,或
  • table2.row_1是1

我已经尝试过了:

SELECT table1.row_1, table1.row_2 
FROM table1
JOIN table2
    ON table1.t1_id = table2.t1_id
WHERE table1.open_1 = 1
    OR table2.row_1 = 1

但是它不会返回open_1为1的结果。

我认为这是因为当open_1 = 1时,table2中没有关联的行,因此JOIN子句不检索任何行。

如果我执行2个查询,我可以轻松做到(首先检索open_1为1的行,然后检索table1.t1_id = table2.t1_id的行),但我想用1查询。

我可以使用1个查询吗?

数据:

  

表1:

t1_id    row_1    row_2    open_1
1        5        3        1      <---- open_1 = 1, so retrieve this
2        4        7        0
3        6        2        0
4        8        1        0
5        9        7        0
  

表2:

t1_id    row_1    row_2    row_3
2        0        3        4
2        1        2        5     <--- row_1 is 1
2        1        4        2
3        0        3        4
3        1        2        5     <--- row_1 is 1
4        0        4        2
5        0        3        4

因此在table1中,第一行的open_1为1,所以我要检索该行,而对于第2-5行的open_1为0,所以我要检索仅当table2中的匹配行的row_1 = 1时,这些结果才会出现。

所以我想检索3个结果:

row_1    row_2
5        3
4        7
6        2

我的问题是我无法检索第一行(其中open_1 = 1),因为第二个表中没有相应的行。因此,我希望有一种方法可以在open_1 = 1时添加此行,而不考虑JOIN

3 个答案:

答案 0 :(得分:2)

您可以使用 union 子句:

select table1.row_1, table1.row_2 
FROM table1 where table1.open_1 = 1
UNION
SELECT table1.row_1, table1.row_2 
FROM table1
JOIN table2
ON table1.t1_id = table2.t1_id
WHERE table2.row_1 = 1

答案 1 :(得分:0)

使用左联接

  Select  distinct t1.row_1,t1.row_2 from table1  t1
      left join table2 t2 on
     t1.t1_id=t2.t1_id  where t1.open_1=1 or t2.row_1=1

答案 2 :(得分:0)

您需要一个LEFT JOIN

SELECT table1.row_1, table1.row_2 
FROM table1
LEFT JOIN table2
    ON table1.t1_id = table2.t1_id
WHERE table1.open_1 = 1
    OR table2.row_1 = 1