有三个表,A,B和C有共同的列(名称和编号)
- 表A有10条记录(比如说x),它们只能来自表B(比如说y)和表C(比如说z)(比如,x = y + z)。
- 在表A中,有一些记录的值为0(零)
- 我需要使用column = name和其他两个表来比较那些基于零值的记录。
- 并检查列"编号"对于同一个"名称"表B和表C?
中的值也为零(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中有些,但两者都没有。
答案 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
,这更容易编写和阅读。我建议你采用这种风格,因为它被广泛接受。