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... 以及三个不同的 Types - WARLOCK、HUNTER、WARRIOR ...如果这是您使用的相同数据,这将是我看到的问题之一。请参阅上面的编辑。 Ty 确实这比预期的效果要好一些,但它确实有效:D ty

以上是关于T-SQL STRING_AGG 问题不知道是写得不好还是不工作的主要内容,如果未能解决你的问题,请参考以下文章

String_agg 模拟 [重复]

在 STRING_AGG 中产生 DISTINCT 值

string_agg 行为不正确

greenplum STRING_AGG 函数转换为 hiveSQL

PG 函数-string_agg

wireshark 抓包入门教程