此应用程序中的自然联接还是外部联接?

时间:2019-04-21 14:32:01

标签: sql

我有三个表,我需要将它们联接到一个输出表中,但是似乎没有联接或逗号会产生所需的输出

表是

                        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

我尝试使用自然联接代替逗号,但是我没有得到想要的输出,我不明白自然联接应该可以轻松解决问题的问题吗?

3 个答案:

答案 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;

检查http://sqlfiddle.com/#!9/82244c/1

答案 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;