在Oracle中如何连接两个表,其中一个引用的表列具有空值?

时间:2015-11-10 14:15:05

标签: sql oracle join

让我详细解释一下这个问题。     我有4张桌子A,B,C,D。     A,B,C是具有主数据的表,其中没有行或列为空。     但D是使用主表A,B,C但在某些行中具有空值的映射表。

Now I wanted to join the 4 tables and display the output.

   An Example:

CREATE TABLE A
  (aid NUMBER,aval VARCHAR2(1)
  );
CREATE TABLE B
  (bid NUMBER,bval VARCHAR2(1)
  );
CREATE TABLE C
  (cid NUMBER,cval VARCHAR2(1)
  );
CREATE TABLE D
  (
    did NUMBER,
    aid NUMBER,
    bid NUMBER,
    cid NUMBER,
    CONSTRAINT fk1 FOREIGN KEY (aid) REFERENCES A(aid),
    CONSTRAINT fk2 FOREIGN KEY (bid) REFERENCES B(bid),
    CONSTRAINT fk3 FOREIGN KEY (cid) REFERENCES C(cid)
  );
INSERT INTO A VALUES
  (1,'s'
  );
INSERT INTO A VALUES
  (2,'p'
  );
INSERT INTO B VALUES
  (1,'K'
  );
INSERT INTO B VALUES
  (2,'L'
  );
INSERT INTO C VALUES
  (1,'M'
  );
INSERT INTO C VALUES
  (2,'N'
  );
INSERT INTO D VALUES
  (1,1,1,1
  );
INSERT INTO D VALUES
  (1,2,NULL,NULL
  );
INSERT INTO D VALUES
  (1,1,2,NULL
  );
INSERT INTO D VALUES
  (1,1,NULL,2
  );

现在我希望输出如下:

s  K      M
p  null   null
s  L      null
s  null   N

我在下面的评论中解释了编辑过的问题。   确切的查询如下:

SELECT DISTINCT A.NM,
  B.NM,
  G.NM
FROM w H
INNER JOIN A
ON H.id   = A.ID
AND H.FLG ='Y'
INNER JOIN F
ON F.ID  = H.ID
AND F.ID =1
INNER JOIN E
ON F.ID        = E.ID
AND E.BYu NOT IN ('7','1')
AND E.Dex      = 'A'
LEFT JOIN B
ON B.ID= E.ID
LEFT JOIN G
ON G.ID = E.ID
ORDER BY 1;

我的第一篇文章中的D表是所有代码或选择组合直到B的左连接   此查询正在运行但我不确定这是最佳做法。   我想知道如何在连接表之前过滤左外连接中的左侧表(我不想在使用where子句后过滤它,因为它会降低性能)。 我也知道左外连接中的右侧表是使用连接本身中的"和子句过滤的。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

这似乎是一个简单的外部联接...

  select aval,bval,cval from d
  left join a on a.aid = d.aid
  left join b on b.bid = d.bid
  left join C on c.cid = d.cid

也许您需要了解联接的工作原理。这是一个great article

并查询结果。

enter image description here