将表一值与postgresql中的两个不同表进行比较

时间:2014-08-05 20:43:55

标签: sql postgresql join left-join

有三个表,A,B和C有共同的列(名称和编号)

  
      
  1. 表A有10条记录(比如说x),它们只能来自表B(比如说y)和表C(比如说z)(比如,x = y + z)。
  2.   
  3. 在表A中,有一些记录的值为0(零)
  4.   
  5. 我需要使用column = name和其他两个表来比较那些基于零值的记录。
  6.   
  7. 并检查列"编号"对于同一个"名称"表B和表C?
  8. 中的值也为零(0)   

我尝试编写下面的示例查询来测试我的3组表数据 - 但由于某些原因,我无法获得所有10条记录的结果?

SELECT a.name,a.number as A_number, b.number as B_number, c.number as C_number
from A a, B b, C c
WHERE a.name = b.name

上面的查询在sqlfiddle -

中给出了如下数据

http://sqlfiddle.com/#!2/57f86/1

在上述数据中,没有记录name="hello" 任何人都可以在我出错的地方纠正我吗?以及如何获得确切的结果?我需要表A中的所有记录。我知道如果我使用左连接,它将填充所有左表数据,即使没有匹配。

  

可能性:表A有记录,有些可能出现在表B中   表C中有些,但两者都没有。

3 个答案:

答案 0 :(得分:2)

我认为这就是你想要的:

SELECT a.*, b.number as bnumber, c.number as cnumber
from a left outer join
     b
     on a.name = b.name left outer join
     c
     on a.name = c.name
where a.number = 0;

顺便说一下,这是一个Postgres SQL小提琴。

答案 1 :(得分:2)

自从JOIN关键字添加到SQL以来,已有20多年了。使用它:

select
  a.name,
  a.number as A_number,
  b.number as B_number,
  c.number as C_number
from A a
left join B b on a.name = b.name
left join C c on a.name = c.name
where a.number = 0

这里的关键是使用left join,它允许返回表A中的所有行,即使其他表中没有匹配的行。

如果您想在其他表中的数字为零时显示true / false,请执行以下操作:

select
  a.name,
  a.number as A_number,
  (b.number = 0 and c.number = 0) as zero_elsewhere
from A a
left join B b on a.name = b.name
left join C c on a.name = c.name
where a.number = 0

答案 2 :(得分:0)

当您编写WHERE a.name = b.name时,将表A中返回的记录限制为仅存在于表B中的记录。这不等同于左连接。如果您只使用WHERE语句,则需要执行以下操作:

WHERE ((a.name = b.name) OR (b.name is NULL))
AND
((a.name = c.name) OR (c.name is NULL))

在评论和其他答案中,他们一直在使用LEFT JOIN,这更容易编写和阅读。我建议你采用这种风格,因为它被广泛接受。