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以避免重复。谢谢你,我用工会代替工会来避免重复。谢谢