在 Windows 10 企業版 21H1 上運行 SQL Server 14.0.2037.2
僅當該 ID 中所有行的另一列條目與第二個表中類似列的條目匹配時,我才嘗試回傳 ID,同樣在特定 ID 內。例如,
create table #F(patentid VARCHAR(8), subclass VARCHAR(3));
insert into #F values ('l','x');
insert into #F values ('l','y');
insert into #F values ('l','z');
insert into #F values ('m','x');
insert into #F values ('n','z');
create table #P(patentid VARCHAR(8), subclass VARCHAR(3));
insert into #P values ('b','x');
insert into #P values ('c','w');
insert into #P values ('c','x');
insert into #P values ('c','y');
insert into #P values ('c','z');
insert into #P values ('d','x');
insert into #P values ('d','y');
insert into #P values ('d','z');
insert into #P values ('e','x');
insert into #P values ('e','y');
insert into #P values ('e','z');
我正在嘗試撰寫一個查詢,該查詢將為 #F 中的每個專利 ID 回傳 #P 中子類條目完全匹配的所有專利 ID。#F 中的 "l" 與 #P 中的 "d" 和 "e" 匹配 [匹配的子類是 'x'、'y' 和 'z'] 以及 #F 中的 "m" 也是如此與 #P 中的 "b" 匹配 [匹配的子類是 "x"]
輸出應該是:
l, d
l, e
m, b
代碼需要高效,因為 #F 和 #P 都包含數百萬行。我試過 Union,但它適用于整組行,并且不允許按子集匹配(即在一個專利 ID 內)
非常感謝任何幫助。
uj5u.com熱心網友回復:
這是一個無余數關系除法的例子,有多個除數。
換句話說,您想要除以(在關系意義上)#F,#P并且只在沒有余數的情況下取結果。
解決方法很多,這里只有一個
- 對兩個表進行磁區
patentid并計算視窗計數 - 左連接一個表到另一個表
subclass,過濾精確匹配的計數 - 按 ID 對分組
- 過濾掉所有沒有
f.subclass匹配的東西p.subclass,我們這樣做是HAVING COUNT(*) = COUNT(p.subclass)因為COUNT(p.subclass)只計算非空值。
SELECT
f.patentid, p.patentid
FROM (
SELECT *,
cnt = COUNT(*) OVER (PARTITION BY f.patentid)
FROM #F f
) f
LEFT JOIN (
SELECT *,
cnt = COUNT(*) OVER (PARTITION BY p.patentid)
FROM #P p
) p ON p.cnt = f.cnt AND p.subclass = f.subclass
GROUP BY
f.patentid, p.patentid
HAVING COUNT(*) = COUNT(p.subclass);
資料庫<>小提琴
uj5u.com熱心網友回復:
這對你來說足夠有效嗎?
select f.patentId, p.patentid
from (
select patentId, STRING_AGG(subclass,'') WITHIN GROUP (ORDER BY subclass ASC) as class
from #F
group by patentId
) f
inner join (
select patentId, STRING_AGG(subclass,'') WITHIN GROUP (ORDER BY subclass ASC) as class
from #P
group by patentId
) p on f.class = p.class
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/313287.html
標籤:sql sql-server 查询语句 关系划分
上一篇:字串匹配和排序邏輯
