sql - 选择如何只匹配每个值一次?
问题描述
我正在匹配来自table1
and的金额值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)都会很好。
解决方案
试试这个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
推荐阅读
- python - 从 Adobe Premiere / Encoder in Python 和 FFMPEG 中生成的 MP4 获取时间码
- c# - 使用泛型时如何与 EF 创建多对多关系
- java - 如何将 JSON 字符串解析为 ListView?
- javascript - React useState Hook - 无法清除表单数据上的状态
- azure - Azure API 出口成本 - 了解通过 API 从 Azure 提取数据的成本
- javascript - 如何让登录控制台的整个数组出现在选定的 id 标记中?
- django - Google API/Celery(使用 django/redis)- 带有 api 调用的函数作为普通函数工作,添加 .delay() 以将其添加到异步任务队列,出现 SSL 错误
- ios - 选择 TextField 时,导航栏被推出安全区域
- json - 将 cURL 转换为 PowerShell Invoke-WebRequest - JSON 数据表问题
- python - 如何使用 selenium python 查找与特定 WebElement 相关的以前的 WebElement