我有兩個 SQL Server 表。
第一張表:Product
| ID | 標題 | 標簽 |
|---|---|---|
| 1 | P1583 | 2,5 |
| 2 | P1234 | 1,3 |
| 3 | P1456 | 1 |
第二張表 - Tag:
| ID | 標題 |
|---|---|
| 1 | 褲子 |
| 2 | 短褲 |
| 3 | 襯衫 |
| 4 | T 恤 |
| 5 | 裙子 |
我想要這個結果
| 產品編號 | 標題 | 標簽名稱 |
|---|---|---|
| 1 | P1583 | 短裙 |
| 2 | P1234 | 褲子、襯衫 |
| 3 | P1456 | 褲子 |
我該如何撰寫查詢?
SELECT
P.Id AS ProductId,
P.Title AS Title,
????
FROM
Product P
LEFT JOIN
Tag T ON T.Id = P.Tags --- (this is not working)
uj5u.com熱心網友回復:
進行拆分和重新聚合的另一種方法是修改@FlexYourData 的出色答案:
SELECT
p.Id,
p.Title,
tags.TagName
FROM Product p
CROSS APPLY (
SELECT
TagName = STRING_AGG(t.Title, ',')
FROM STRING_SPLIT(p.Tags, ',') tags
INNER JOIN Tag t ON tags.value = t.id
) tags;
理想情況下,您應該規范化您的架構并創建一個單獨的連接表:
CREATE TABLE ProductTag (
ProductId REFERENCES Product (Id),
TagId REFERENCES Tag (Id)
);
INSERT ProductTag (ProductId, TagId)
SELECT
p.Id,
tags.value
FROM Product p
CROSS APPLY STRING_SPLIT(p.Tags, ',') tags;
然后您的查詢變為:
SELECT
p.Id,
p.Title,
tags.TagName
FROM Product p
CROSS APPLY (
SELECT
TagName = STRING_AGG(t.Title, ',')
FROM ProductTags pt
INNER JOIN Tag t ON pt.TagId = t.id
WHERE pt.ProductId = p.Id
) tags;
uj5u.com熱心網友回復:
因此,創建資料:
CREATE TABLE #t (id int, title nvarchar(5), tags nvarchar(3));
INSERT INTO #t (id,title,tags)
VALUES
(1,'P1583','2,5'),
(2,'P1234','1,3'),
(3,'P1456','1');
CREATE TABLE #tag (id int, title nvarchar(10));
INSERT INTO #tag (id,title)
VALUES
(1,'Pants'),
(2,'Shorts'),
(3,'Shirts'),
(4,'Tshirts'),
(5,'Skirts');
使用 STRING_SPLIT 和 CROSS APPLY 給我們:
SELECT #t.id, #t.title, #t.tags, tags.value, #tag.title
FROM #t
CROSS APPLY STRING_SPLIT(#t.tags,',') tags
INNER JOIN #tag ON tags.value = #tag.id;
| ID | 標題 | 標簽 | 價值 | 標題 |
|---|---|---|---|---|
| 1 | P1583 | 2,5 | 2 | 短褲 |
| 1 | P1583 | 2,5 | 5 | 裙子 |
| 2 | P1234 | 1,3 | 1 | 褲子 |
| 2 | P1234 | 1,3 | 3 | 襯衫 |
| 3 | P1456 | 1 | 1 | 褲子 |
從那里你只需 STRING_AGG 回到一起:
WITH exp
AS (
SELECT #t.id, #t.title, #t.tags, tags.value, #tag.title AS tag_title
FROM #t
CROSS APPLY STRING_SPLIT(#t.tags,',') tags
INNER JOIN #tag ON tags.value = #tag.id
)
SELECT id, title, STRING_AGG(tag_title,',') WITHIN GROUP (ORDER BY tag_title) AS tag_titles
FROM exp
GROUP BY id, title;
uj5u.com熱心網友回復:
你的桌子
declare @r TABLE (
Id int NOT NULL
,Title VARCHAR(10) NOT NULL
,Tags VARCHAR(30) NOT NULL
);
INSERT INTO @r(Id,Title,Tags) VALUES (1,'P1583','2,5');
INSERT INTO @r(Id,Title,Tags) VALUES (2,'P1234','1,3');
INSERT INTO @r(Id,Title,Tags) VALUES (3,'P1456','1');
declare @t TABLE (
Id int NOT NULL PRIMARY KEY
,Title VARCHAR(70) NOT NULL
);
INSERT INTO @t(Id,Title) VALUES (1,'Pants');
INSERT INTO @t(Id,Title) VALUES (2,'Shorts');
INSERT INTO @t(Id,Title) VALUES (3,'Shirts');
INSERT INTO @t(Id,Title) VALUES (4,'Tshirts');
INSERT INTO @t(Id,Title) VALUES (5,'Skirts');
查詢以產生結果標簽應該被拆分并再次與第二個表的標題合并
with t as(
SELECT Id,Title,
PARSENAME(REPLACE(Tags,',','.'),2) 'Tag1' ,
PARSENAME(REPLACE(Tags,',','.'),1) 'Tag2'
FROM @r)
select t.id,t.Title,concat(t1.Title,iif(t1.Title is null,'',','),t2.Title)
tagName from t
full join @t t1 on t1.id=t.Tag1
join @t t2 on t2.id=t.Tag2
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/428248.html
上一篇:SQL中一對值之間的唯一覆寫
