Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL-如何连接两个表,一对多?_Sql_Oracle - Fatal编程技术网

Oracle SQL-如何连接两个表,一对多?

Oracle 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

我希望做一个完整的外部连接,以获得以下结果。我主要是把表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   | 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是另一个会计系统,最终目标是创建结果集的对账类型。