Oracle SQL-如何连接两个表,一对多?
我希望做一个完整的外部连接,以获得以下结果。我主要是把表1和表2连接起来 但是,在表1中,如果a列中有0,但表1中键1列ABC100键1值中有相同的可用值,则只使用表1中的记录1,忽略表1中的0记录2 当连接到表2,特别是ABC100时,我希望在预期的表结果中看到输出行1和2 对此有什么帮助或想法吗 例如: 表1Oracle SQL-如何连接两个表,一对多?,sql,oracle,Sql,Oracle,我希望做一个完整的外部连接,以获得以下结果。我主要是把表1和表2连接起来 但是,在表1中,如果a列中有0,但表1中键1列ABC100键1值中有相同的可用值,则只使用表1中的记录1,忽略表1中的0记录2 当连接到表2,特别是ABC100时,我希望在预期的表结果中看到输出行1和2 对此有什么帮助或想法吗 例如: 表1 | Key 1 | Column A | | ABC100 | 100 | | ABC100 | 0 | | ABC300 | 20
| Key 1 | Column A |
| ABC100 | 100 |
| ABC100 | 0 |
| ABC300 | 200 |
| ABC400 | 300 |
表2
| Key 2 | Column C |
| ABC100 | 100 |
| ABC200 | 50 |
| ABC300 | 200 |
预期成果:
| Key 1 | Column A | Key 2 | Column B | NVL(A,0) - NVL(B,0)
| ABC100 | 100 | ABC100 | 100 | 0
| ABC100 | NULL | NULL | NULL | NULL
| NULL | NULL | ABC200 | 50 | -50
| ABC300 | 200 | ABC300 | 200 | 0
| ABC400 | 300 | NULL | NULL | 300
您可以使用:
SELECT t1.*, t2.*, NVL(t1.A,0) - NVL(t2.B,0)
FROM tab1 t1
FULL JOIN tab2 t2
ON t1.Key1=t2.Key2
您的结果集表明您需要以下内容:
SELECT t1.key1,
(CASE WHEN t1.a <> 0 THEN t1.a END) as a,
(CASE WHEN t1.a <> 0 THEN t2.key2 END) as key2,
(CASE WHEN t1.a <> 0 THEN t2.c END) as ,
(CASE WHEN t1.a <> 0 THEN COALESCE(t1.A, 0) - COALESCE(t2.B, 0) END) as diff
FROM t1 FULL JOIN
t2
ON t1.Key1 = t2.Key2;
您的描述表明您想要:
SELECT t1.key1, t1.a, t2.key2, t2.c,
COALESCE(t1.A, 0) - COALESCE(t2.B, 0) as diff
FROM (SELECT t1.*
FROM
WHERE t1.A <> 0 OR
NOT EXISTS (SELECT 1 FROM t1 tt1 WHERE tt1.key1 = t1.key1 AND tt1.key1 <> 0)
) t1 FULL JOIN
t2
ON t1.Key1 = t2.Key2;
如果要忽略ABC100,为什么它会在结果集中出现两次?这看起来可能需要一个完整的外部联接。但请记住,必须使用完整的外部联接通常意味着您的数据模型没有正确规划。@TimBiegeleisen我认为这是可能的方法。我之所以进行这种类型的联接,是因为实际上我的表1是一个会计系统,表2是另一个会计系统,最终目标是创建结果集的对账类型。