我試圖從 3 或 4 個其他視圖/表中創建一個新視圖。
表A:
| title_id | 主隊 |
|---|---|
| 1234 | 水星病毒 |
| 5678 | SSV |
| 7890 | 空值 |
| 4321 | SCC |
表B:
| title_id | 客隊 |
|---|---|
| 1234 | SSV |
| 5678 | SFV |
| 7890 | 空值 |
| 4321 | 肯德基 |
表C:
| title_id | 主隊 |
|---|---|
| 1234 | SSV |
| 5678 | 空值 |
| 7890 | AAB |
| 4711 | 高爐 |
我想從這三個中生成一個新視圖,如下所示:
| title_id | 團隊 |
|---|---|
| 1234 | WSV、SSV、SSV |
| 5678 | SSV、SFV、不適用 |
| 7890 | 不適用,不適用,AAB |
| 4321 | SCC、肯德基、不適用 |
| 4711 | 不適用,不適用,BFG |
如您所見,NULL 應該重命名為 N/A,如果 id 不存在于其他表之一中也是如此。我想獲得 DISTINCT title_id。
@DaleK 當然,我試過這樣:
選擇 tableA.title_id, ISNULL(tableA.homeTeam, 'N/A') ',' ISNULL(tableB.awayTeam, 'N/A') ',' ISNULL(tableC.homeTeam, 'N/A' ) 作為來自 tableA、tableB、tableC 的團隊;
這導致對我的表進行無休止的查詢,每個表都有超過 300k 行。
接下來我嘗試加入:
選擇 tableA.title_id, ISNULL(tableA.homeTeam, 'N/A') ',' ISNULL(tableB.awayTeam, 'N/A') ',' ISNULL(tableC.homeTeam, 'N/A' ) 作為來自 tableA 的團隊 FULL JOIN tableB ON tableB.title_id = tableA.title_id FULL JOIN tableC ON tableC.title_id = tableA.tile_id
但老實說,我不確定行數。
uj5u.com熱心網友回復:
您可以UNION ALL將表放在一起,然后使用字串聚合
SELECT
t.title_id,
STRING_AGG(ISNULL(t.team, 'N/A'), ', ') WITHIN GROUP (ORDER BY t.ordering) AS team
FROM (
SELECT
a.title_id,
a.homeTeam AS team,
1 AS ordering
FROM TableA a
UNION ALL
SELECT
b.title_id,
b.awayTeam,
2
FROM TableB b
UNION ALL
SELECT
c.title_id,
c.homeTeam,
3
FROM TableC c
) t
GROUP BY
t.title_id;
對于 SQL Server 2016 及更早版本,您必須使用該FOR XML方法,并且由于您必須多次查詢表,因此效率較低
WITH t AS (
SELECT
a.title_id,
a.homeTeam AS team,
1 AS ordering
FROM TableA a
UNION ALL
SELECT
b.title_id,
b.awayTeam,
2
FROM TableB b
UNION ALL
SELECT
c.title_id,
c.homeTeam,
3
FROM TableC c
)
SELECT
tOuter.title_id,
STUFF(tInner.team.value('text()[1]', 'nvarchar(max)'), 1, LEN(', '), '') AS team
FROM (
SELECT DISTINCT t.title_id
FROM t
) tOuter
CROSS APPLY (
SELECT ', ' ISNULL(t.team, 'N/A')
FROM t
WHERE t.title_id = tOuter.title_id
ORDER BY t.ordering
FOR XML PATH(''), TYPE
) tInner(team);
db<>小提琴
uj5u.com熱心網友回復:
試試這個:
select
COALESCE(a.title_id,b.title_id,c.title_id),
CONCAT(
ISNULL(a.homeTeam,'N/A'),
ISNULL(b.awayTeam,'N/A'),
ISNULL(c.homeTeam,'N/A'),
) 'Teams',
from TableA a
full join TableB b on a.title_id = b.title_id
full join TableC c on c.title_id = a.title_id
where
a.homeTeam is not null
OR b.awayTeam is not null
OR c.homeTeam is not null
group by a.title_id
至于 DISTINCT title_id,默認情況下它應該是唯一的,因為我假設它被用作每個表中的鍵。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/425868.html
