Sql 如何实现合并两个表的联接—完全外部联接并避免重复?

Sql 如何实现合并两个表的联接—完全外部联接并避免重复?,sql,oracle,Sql,Oracle,我正在尝试将表A和表B加入一个新表。我希望避免重复,但我希望保留表中的所有记录 我已经尝试了完全外部连接,左外部连接,但我无法达到预期的结果 TABLE A ====================== CLIENT_ID SUPPLIER_NO INVOICE_COUNT VOLUME ABC 1234 10 456 GEF 4567 20 657 ERT

我正在尝试将
表A
表B
加入一个新表。我希望避免重复,但我希望保留表中的所有记录

我已经尝试了完全外部连接,左外部连接,但我无法达到预期的结果

TABLE A
======================
CLIENT_ID   SUPPLIER_NO  INVOICE_COUNT VOLUME
ABC         1234         10            456
GEF             4567         20        657      
ERT         8912         30        567
THE         6872         42        781

TABLE B
========================
CLIENT_ID   SUPPLIER_NO REJECTED_COUNT  REJECTED_VOLUME
ERT     8912        56          102
HJI     7823        34          781
REW     6721        45          632

FINAL TABLE(WHAT IT SHOULD LOOK LIKE)
========================
CLIENT_ID SUPPLIER_NO INVOICE_COUNT VOLUME REJECTED_COUNT REJECTED_VOLUME
ABC   1234        10         456   NULL or 0      NULL or 0 
GEF   4567        20         657   NULL or 0      NULL or 0     
ERT   8912        30         567   56         102
THE   6872        42         781   NULL or 0      NULL or 0     
HJI   7823        NULL       NULL  34         781
REW   6721        NULL       NULL  45         632
我的问题是

select   A.client_id
      ,  A.supplier_no
      ,  count(*)        as Rejected_Count 
      , sum(TOTAL_AMT)   as Rejected_Volume
      , count(*)         as InvoiceCount 
      , sum(INVOICE_AMT) as Volume  
from TABLEA A 
     FULL OUTER JOIN TABLEB B 
         ON A.client_id=B.client_id 
        AND A.SUPPLIER_NO=B.SUPPLIER_NO
group by  A.client_id,  A.supplier_no
order by A.client_id,  A.supplier_no;
无论我是否与
客户id
供应商编号
进行连接,我都无法实现此输出。如果遍历后
客户端id
不在表A中,我希望表B中的内容避免重复。表A只是查询的结果,表B是相同的,我想合并这些结果。

将您的连接修复为:

FULL OUTER JOIN 
    TABLEB B ON A.client_id = B.client_id 
             AND A.SUPPLIER_NO = B.SUPPLIER_NO
现在,它正在从同一个表连接到同一列上

将您的连接修复为:

FULL OUTER JOIN 
    TABLEB B ON A.client_id = B.client_id 
             AND A.SUPPLIER_NO = B.SUPPLIER_NO

到目前为止,它是在同一个表的同一列上联接的

我认为可以使用
UNION ALL
GROUP BY
实现这一点,如下所示:

SELECT CLIENT_ID, SUPPLIER_NO,
MAX(INVOICE_COUNT) AS INVOICE_COUNT,
MAX(VOLUME) AS VOLUME,
MAX(REJECTED_COUNT) AS REJECTED_COUNT,
MAX(REJECTED_VOLUME) AS REJECTED_VOLUME
FROM
(SELECT CLIENT_ID, SUPPLIER_NO, INVOICE_COUNT, VOLUME, NULL AS REJECTED_COUNT, NULL REJECTED_VOLUME
FROM TABLEA
UNION ALL
SELECT CLIENT_ID, SUPPLIER_NO, NULL AS INVOICE_COUNT, NULL AS VOLUME, REJECTED_COUNT, REJECTED_VOLUME
FROM TABLEB)
GROUP BY CLIENT_ID, SUPPLIER_NO;
根据您的要求使用聚合函数。我使用了
max


干杯

我认为这可以通过使用
UNION ALL
GROUP BY
实现,如下所示:

SELECT CLIENT_ID, SUPPLIER_NO,
MAX(INVOICE_COUNT) AS INVOICE_COUNT,
MAX(VOLUME) AS VOLUME,
MAX(REJECTED_COUNT) AS REJECTED_COUNT,
MAX(REJECTED_VOLUME) AS REJECTED_VOLUME
FROM
(SELECT CLIENT_ID, SUPPLIER_NO, INVOICE_COUNT, VOLUME, NULL AS REJECTED_COUNT, NULL REJECTED_VOLUME
FROM TABLEA
UNION ALL
SELECT CLIENT_ID, SUPPLIER_NO, NULL AS INVOICE_COUNT, NULL AS VOLUME, REJECTED_COUNT, REJECTED_VOLUME
FROM TABLEB)
GROUP BY CLIENT_ID, SUPPLIER_NO;
根据您的要求使用聚合函数。我使用了
max


干杯

我认为
使用
子句是最简单的解决方案:

select client_id, supplier_no,
       count(*)        as Rejected_Count,
       sum(TOTAL_AMT)   as Rejected_Volume,
       count(*)         as InvoiceCount ,
       sum(INVOICE_AMT) as Volume  
from TABLEA A full join
     TABLEB B 
     using (client_id, SUPPLIER_NO)
group by client_id, supplier_no
order by client_id, supplier_no;
另一种选择是慷慨地帮助
coalesce()


我认为
使用
子句是最简单的解决方案:

select client_id, supplier_no,
       count(*)        as Rejected_Count,
       sum(TOTAL_AMT)   as Rejected_Volume,
       count(*)         as InvoiceCount ,
       sum(INVOICE_AMT) as Volume  
from TABLEA A full join
     TABLEB B 
     using (client_id, SUPPLIER_NO)
group by client_id, supplier_no
order by client_id, supplier_no;
另一种选择是慷慨地帮助
coalesce()


PL/SQL表明您的数据库是Oracle,不是吗?@BarbarosÖzhan YesTypo alert:拼写为Achive-而不是“acheive”…SQL正在尝试sum()在两个联接表中都不存在的列上。@GJones这两个表表A和表B来自两个单独的查询,我试图进行完全的外部联接以获得所需的输出pl/SQL表明您的数据库是Oracle,不是吗?@BarbarosÖzhan YesTypo alert:拼写为Achive-不是“Achive”…SQL正在尝试sum()在两个联接表中都不存在的列上。@GJones这两个表表A和表B来自两个单独的查询,我试图进行完全的外部联接以获得所需的输出。我已修复join我已修复join我使用Union代替Union All以避免重复。谢谢你,我用工会代替工会来避免重复。谢谢