是否可以 UNION 不同的行但忽略一列来确定唯一性?
Is it possible to UNION distinct rows but disregard one column to determine uniqueness?
select d.id, d.registration_number
from DOCUMENTS d
union
select dd.id, dd.registration_number
from DIFFERENT_DOCUMENTS dd
是否可以仅根据 registration_number
的唯一性合并这些结果,而不考虑文档的 id
?
或者,是否有可能以不同的方式实现相同的结果?
补充一下:实际上我合并了 5 个查询,每个大约 20 行,有 4 列在确定唯一性时应该被忽略。
Union
将检查所有列的组合的唯一性。但是,您可以使用 union all
(不会删除重复项),然后使用 row_number
window 函数自己应用逻辑:
SELECT id, registration_number
FROM (SELECT id, registration_number,
ROW_NUMBER() OVER (PARTITION BY registration_number ORDER BY id) AS rn
FROM (SELECT id, registration_number
FROM documents
UNION ALL
SELECT id, registration_number
FROM different_documents) u
) r
WHERE rn = 1
您基本上需要用其他东西包装合并的数据,以便只获得您想要的数据。
SELECT min(id), registration_number
FROM (SELECT id, registration_number
FROM documents
UNION ALL
SELECT id, registration_number
FROM different_documents)
GROUP BY registration_number
既然其他答案已经正确,请问为什么您需要检索该查询中的其他列,因为主要目的似乎是收集唯一的注册号?
先收集唯一的注册号,然后检索其他信息不是更简单吗?
或者在您的实际查询中,首先收集没有应忽略的列的信息,然后在需要时收集这些列中的信息?
喜欢,例如,用
制作一个视图
SELECT d.registration_number
FROM DOCUMENT d
UNION
SELECT dd.registration_number
FROM DIFFERENT_DOCUMENT dd
然后使用该视图和 JOINS 收集信息?
假设 registration_number
在每个 table 中都是唯一的,您可以使用 not exists
:
select d.id, d.registration_number
from DOCUMENTS d
union all
select dd.id, dd.registration_number
from DIFFERENT_DOCUMENTS dd
where not exists (select 1
from DOCUMENTS d
where dd.registration_number = d.registration_number
);
select d.id, d.registration_number
from DOCUMENTS d
union
select dd.id, dd.registration_number
from DIFFERENT_DOCUMENTS dd
是否可以仅根据 registration_number
的唯一性合并这些结果,而不考虑文档的 id
?
或者,是否有可能以不同的方式实现相同的结果?
补充一下:实际上我合并了 5 个查询,每个大约 20 行,有 4 列在确定唯一性时应该被忽略。
Union
将检查所有列的组合的唯一性。但是,您可以使用 union all
(不会删除重复项),然后使用 row_number
window 函数自己应用逻辑:
SELECT id, registration_number
FROM (SELECT id, registration_number,
ROW_NUMBER() OVER (PARTITION BY registration_number ORDER BY id) AS rn
FROM (SELECT id, registration_number
FROM documents
UNION ALL
SELECT id, registration_number
FROM different_documents) u
) r
WHERE rn = 1
您基本上需要用其他东西包装合并的数据,以便只获得您想要的数据。
SELECT min(id), registration_number
FROM (SELECT id, registration_number
FROM documents
UNION ALL
SELECT id, registration_number
FROM different_documents)
GROUP BY registration_number
既然其他答案已经正确,请问为什么您需要检索该查询中的其他列,因为主要目的似乎是收集唯一的注册号?
先收集唯一的注册号,然后检索其他信息不是更简单吗?
或者在您的实际查询中,首先收集没有应忽略的列的信息,然后在需要时收集这些列中的信息?
喜欢,例如,用
制作一个视图SELECT d.registration_number
FROM DOCUMENT d
UNION
SELECT dd.registration_number
FROM DIFFERENT_DOCUMENT dd
然后使用该视图和 JOINS 收集信息?
假设 registration_number
在每个 table 中都是唯一的,您可以使用 not exists
:
select d.id, d.registration_number
from DOCUMENTS d
union all
select dd.id, dd.registration_number
from DIFFERENT_DOCUMENTS dd
where not exists (select 1
from DOCUMENTS d
where dd.registration_number = d.registration_number
);