我有三个表,我需要将它们联接到一个输出表中,但是似乎没有联接或逗号会产生所需的输出
表是
E G | E S | E B
数据看起来像这样
e1 g1 | e1 s1 | e1 b1
e2 g2 | e2 s2 | e2 b2
select e1,g,s,b from
(select e as e1, m as g from table x where m=g),
(select e as e2, m as s from table x where m=s),
(select e as e3, m as b from table x where m=b)
where e1=e2 AND e2=e3;
我想要的输出是
E | G | S | B
e1| g1| s1| b1
e2| g2| s2| b2
但是我得到了乘法结果
e1 g1 s1 b1
e1 g1 s1 b2
e1 g1 s2 b1
e1 g1 s2 b2
我尝试使用自然联接代替逗号,但是我没有得到想要的输出,我不明白自然联接应该可以轻松解决问题的问题吗?
答案 0 :(得分:1)
一个简单的JOIN
可以做到:
select
e.e,
e.g,
s.s,
b.b
from e
join s on s.e = e.e
join b on b.e = e.e
结果(请参阅SQL Fiddle):
e g s b
-- -- -- --
e1 g1 s1 b1
e2 g2 s2 b2
作为参考,这是我使用的数据:
create table e (e varchar(2), g varchar(2));
insert into e (e, g) values ('e1', 'g1'), ('e2', 'g2');
create table s (e varchar(2), s varchar(2));
insert into s (e, s) values ('e1', 's1'), ('e2', 's2');
create table b (e varchar(2), b varchar(2));
insert into b (e, b) values ('e1', 'b1'), ('e2', 'b2');
最后的提示:根据经验,请尽量避免自然加入。它们晦涩难懂且易于出错。最糟糕的是,在数据库[不可避免地]更改一段时间后,它们无法幸免。
答案 1 :(得分:0)
使用相关查询:
select e.col1 E,e.col2 G,(select s.col2 from s where s.col1=e.col1 ) S,
(select
b.col2 from b where b.col1=e.col1 ) B
from e;
答案 2 :(得分:-1)
一个简单的NATURAL JOIN
很有效:
SELECT e, g, s, b
FROM e NATURAL JOIN s NATURAL JOIN b;
结果(请参见SQL Fiddle):
e g s b
-- -- -- --
e1 g1 s1 b1
e2 g2 s2 b2
最后一点:自然连接只是您需要的连接类型,它比“传统”连接具有优势,例如没有重复的列意味着您不需要范围变量来解决它们。
您选择的SQL产品是否包含错误?所有软件都可以;如果您有问题,请尝试其他SQL产品。
如果您担心方案的不受控制的更改会在将来影响查询的语义,那么可以采用多种防御性编码方式,例如使用CTE:
WITH e1 AS ( SELECT e, g FROM e ),
s1 AS ( SELECT e, s FROM s ),
b1 AS ( SELECT e, b FROM b )
SELECT e, g, s, b
FROM e1 NATURAL JOIN s1 NATURAL JOIN b1;