T-SQL STRING_AGG 问题不知道是写得不好还是不工作
Posted
技术标签:
【中文标题】T-SQL STRING_AGG 问题不知道是写得不好还是不工作【英文标题】:T-SQL STRING_AGG problems dunno if bad writing or just not working 【发布时间】:2020-04-15 01:31:14 【问题描述】:为什么我在第一部分没有看到我的 i.inventoryId 的分离? 但是当我在另一个选择中选择它们时,我会得到更多的结果。 还有'Jedi' == (PlayerAvatarId 6)
https://i.ibb.co/XW4NJC7/image.png
SELECT p.FirstName [Spelers Voornaam]
,p.LastName [Spelers Achternaam]
,pa.AvatarName [Spelers Avatarnaam]
,pa.FamilyName [Familie's Groeps Naam]
,Av.Type [Avatar's Type]
,string_agg (i.InventoryId, ',') as [In Inventory]
FROM Player AS p
LEFT JOIN PlayerAvatar AS pa ON p.PlayerId = pa.PlayerId
LEFT JOIN Avatar AS Av ON pa.AvatarId = Av.AvatarId
LEFT JOIN Avatar AS a ON pa.AvatarId = a.AvatarId
LEFT JOIN Inventory as i on i.InventoryId = pa.InventoryId
LEFT JOIN Item as it on it.ItemId = i.ItemId
WHERE pa.AvatarName = 'Jedi'
GROUP BY p.FirstName, p.LastName, pa.AvatarName, pa.FamilyName, av.Type, i.InventoryId
SELECT *
from Inventory
Where PlayerAvatarId = 6
【问题讨论】:
【参考方案1】:如果您要连接的是 InventoryId,我认为您不想按此分组...试试这个:
编辑,需要逐行删除不同的列。
SELECT p.FirstName [Spelers Voornaam]
,p.LastName [Spelers Achternaam]
,pa.FamilyName [Familie's Groeps Naam]
,string_agg (i.InventoryId, ',') as [In Inventory]
FROM Player AS p
LEFT JOIN PlayerAvatar AS pa ON p.PlayerId = pa.PlayerId
LEFT JOIN Avatar AS Av ON pa.AvatarId = Av.AvatarId
LEFT JOIN Avatar AS a ON pa.AvatarId = a.AvatarId
LEFT JOIN Inventory as i on i.InventoryId = pa.InventoryId
LEFT JOIN Item as it on it.ItemId = i.ItemId
GROUP BY p.FirstName, p.LastName, pa.AvatarName, pa.FamilyName, av.Type
或者您也可以聚合这些列。
SELECT p.FirstName [Spelers Voornaam]
,p.LastName [Spelers Achternaam]
,string_agg(pa.AvatarName,',') [Spelers Avatarnaam]
,pa.FamilyName [Familie's Groeps Naam]
,string_agg(Av.Type,',') [Avatar's Type]
,string_agg (i.InventoryId, ',') as [In Inventory]
FROM Player AS p
LEFT JOIN PlayerAvatar AS pa ON p.PlayerId = pa.PlayerId
LEFT JOIN Avatar AS Av ON pa.AvatarId = Av.AvatarId
LEFT JOIN Avatar AS a ON pa.AvatarId = a.AvatarId
LEFT JOIN Inventory as i on i.InventoryId = pa.InventoryId
LEFT JOIN Item as it on it.ItemId = i.ItemId
GROUP BY p.FirstName, p.LastName, pa.FamilyName,
【讨论】:
仍然只显示 [in inventory] 中的 5 需要显示至少 9 条不同的记录,请参阅我刚刚选择库存项目的屏幕截图 那么我敢打赌应该删除其他列之一。删除WHERE pa.AvatarName = 'Jedi'
并发布示例数据。这是一个SQL Fiddle,它描述了只要您有正确的分组,它就应该可以工作。
对不起,我是 sql 中的新“菜鸟”,并不真正理解你想要的那个小提琴。如果您想查看我的项目,请查看我的 github github.com/janmoenens/database 一切都在那里,但我所有的写作都是荷兰语。但是如果你进入我的examenDatabase 文件夹,你需要的一切都应该在那里,如果你愿意的话,你可以自己构建它。我正在做的这个项目是为了我的 sql 考试
查看您的 github 数据...对于 PlayerId = 31
,有三个不同的 AvatarName
值 - Jedi、Jedi2、Jedi3... 以及三个不同的 Type
s - WARLOCK、HUNTER、WARRIOR ...如果这是您使用的相同数据,这将是我看到的问题之一。请参阅上面的编辑。
Ty 确实这比预期的效果要好一些,但它确实有效:D ty以上是关于T-SQL STRING_AGG 问题不知道是写得不好还是不工作的主要内容,如果未能解决你的问题,请参考以下文章