首页 > 解决方案 > 选择如何只匹配每个值一次?

问题描述

我正在匹配来自table1and的金额值table2,这些表具有重复和不同的行数。任何金额只能匹配一次(因此不是标准选择的工作方式),因为选择表中的总金额应该保持不变,就像我添加了该表中的所有插入值一样。

CREATE TABLE table1 (
    table1_amount int
);
INSERT INTO table1 (table1_amount)
VALUES
    (22),
    (11),
    (35),
    (45),
    (45),
    (65),
    (22),
    (22),
    (878),
    (56);

CREATE TABLE table2 (
    table2_amount int
);
INSERT INTO table2 (table2_amount)
VALUES
    (324),
    (43),
    (34),
    (35),
    (22),
    (22),
    (12),
    (35),
    (6);

标准选择将返回 6 行与三个“22”从匹配table1到两个“22”从table2(因此每个“22”从table1匹配两次):

SELECT table1.table1_amount, table2.table2_amount
FROM table1 FULL OUTER JOIN table2 ON table1.table1_amount=table2.table2_amount;

table1_amount table2_amount
22 22
22 22
22 22
22 22
22 22

现在,我希望只有 2 个匹配项 + 1 个不匹配的数量table1

table1_amount table2_amount
22 22
22 22
22 NULL

你怎么能那样做?我在这里指的是 SQL,但任何解决方案(Excel、Access)都会很好。

标签: sqlselectduplicatesfull-outer-join

解决方案


试试这个Row_Number()

with cte1 as
(Select *, ROW_NUMBER() over (partition by table1_amount order by table1_amount) as ranking from table1),
 cte2 as
(Select *,ROW_NUMBER() over (partition by table2_amount order by table2_amount) as ranking from table2)
Select cte1.table1_amount, cte2.table2_amount from cte1 FULL OUTER JOIN cte2 on cte1.table1_amount = cte2.table2_amount and cte1.ranking = cte2.ranking

推荐阅读