所以我正在努力尋找下一個問題的邏輯:
我有 2 張桌子
表 A 具有以下列
Postalcode
1111
2222
3333
4444
表 B 有以下列
Postalcode
1111AA
1111BB
1111CA
2222AA etc
我想要的是,如果從表 B 中的表 A 中找到郵政編碼的前 4 個數字,那么我想從表 B 中獲得該郵政編碼的第一個結果(4 位數字 2 個字母)。
例如,如果 A 中的郵政編碼是 1111,并且表 B 的子字串(郵政編碼,1, 4)也是 1111,則從表 B 中回傳該郵政編碼的第一個結果 --> 1111AA
我似乎找不到這個問題的答案,我現在掙扎了一段時間。
希望你們有我的解決方案。
uj5u.com熱心網友回復:
如果對于表 A 中的每條記錄,您最多要匹配表 B中的一條記錄,那么OUTER APPLY (SELECT TOP 1 ...)應該可以解決問題。
嘗試:
select a.PostalCode, b1.Postalcode
from table_a a
outer apply (
select top 1 *
from table_b b
where b.Postalcode LIKE a.Postalcode '%'
order by b.id
) b1
order by a.PostalCode;
如果您希望省略沒有匹配 table_b 記錄的結果,請將 更改OUTER APPLY為 a CROSS APPLY。AOUTER APPLY就像一段LEFT JOIN時間 aCROSS APPLY就像一個INNER JOIN。
請參閱此 db<>fiddle fr 演示。
(感謝 Bernd Buffen 的資料設定。請注意,我將 PostalCode 從 INT 更改為 VARCHAR 以簡化匹配標準。)
uj5u.com熱心網友回復:
我已經用虛擬列和索引從@Ergest Basha 更改了樣本
CREATE TABLE table_a (
Postalcode INT ,
KEY idx_sPortalcode (Postalcode)
);
INSERT INTO table_a VALUES
(1111),
(2222),
(3333),
(4444);
CREATE TABLE table_b (
id INT,
Postalcode VARCHAR(25),
sPostalcode INT AS ( 0 Postalcode) STORED,
KEY idx_sPortalcode (sPostalcode)
);
INSERT INTO table_b (id,Postalcode) VALUES
(1,'1111AA'),
(2,'1111BB'),
(3,'1111CA'),
(4,'2222AA');
SELECT * FROM table_b;
-- EXPLAIN
SELECT b.Postalcode
FROM table_a a
INNER JOIN table_b b ON b.sPostalcode=a.Postalcode
WHERE a.Postalcode=1111
ORDER BY b.id ASC LIMIT 1;
uj5u.com熱心網友回復:
像這樣的東西:MySQL
select b.Postalcode
from table_a a
inner join table_b b on LEFT(b.Postalcode,4)=a.Postalcode
where a.Postalcode=1111
order by b.id asc limit 1;
檢查演示
SQL Server
select top(1) b.Postalcode
from table_a a
inner join table_b b on LEFT(b.Postalcode,4)=a.Postalcode
where a.Postalcode=1111
order by b.id ;
演示
根據評論進行編輯* 我認為您需要類似下面的內容,但請查看@Bernd Buffen 的性能建議:
WITH cte AS (
SELECT Postalcode, ROW_NUMBER() OVER ( PARTITION BY LEFT(Postalcode,4) ORDER BY id asc ) row_num
FROM table_b
)
SELECT cte.Postalcode
FROM table_a a
INNER JOIN cte on LEFT(cte.Postalcode,4)=a.Postalcode
WHERE row_num = 1 ;
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/430087.html
上一篇:SQL:從路徑中提取字串
下一篇:為具有相同值的連續行生成識別符號
