让我详细解释一下这个问题。 我有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子句后过滤它,因为它会降低性能)。 我也知道左外连接中的右侧表是使用连接本身中的"和子句过滤的。
非常感谢任何帮助。
答案 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
并查询结果。