【问题标题】:How to delete duplicates after STRING_AGG?如何在 STRING_AGG 之后删除重复项?
【发布时间】:2019-11-22 08:25:34
【问题描述】:

首先我要告诉你我是SQL的初学者。

我想选择与我的计划相关的所有信息,因为它的 id 将它们放在我的 C# 程序中的 DataGridView 中。

我们可以将多个 voltage levelscatenary types 等...

因此,当我尝试选择与计划相关的所有信息时,如果它具有多种电压和/或多种接触网类型,它将像这样重复行:

然后我尝试STRING_AGG,但现在我在行中有重复项,我不知道如何避免/删除它们..

这是我的查询:

SELECT TOP 20 pinfos.id
     , STRING_AGG(pinfos.plan_name, '|') 
     , STRING_AGG (voltage.name, '|') AS vname 
     , STRING_AGG(catType.name, '|') AS catname
FROM [allocation_schematic.information].primary_infos pinfos
     LEFT JOIN [allocation_schematic.types].plans_into_type pit 
            ON pinfos.id = pit.id_plan
     LEFT JOIN [allocation_schematic.types].catenary_type catType 
            ON pit.id_type = catType.id
     LEFT JOIN [allocation_schematic.types].plans_into_voltage pot 
            ON pinfos.id = pot.id_plan
     LEFT JOIN [allocation_schematic.types].voltage voltage 
            ON pot.id_voltage = voltage.id
GROUP BY pinfos.id

但我想要这样:

我已经检查了this first solutionthis second one,但我不明白如何用我的查询来实现它。

有人可以帮我解决这个问题吗?自从两天以来我一直在遇到这个麻烦..

谢谢!

【问题讨论】:

    标签: c# sql duplicates azure-sql-database string-aggregation


    【解决方案1】:

    试试这个查询怎么样:

    SELECT TOP 20 pinfos.id
        , STRING_AGG(pinfos.plan_name, '|') 
         , STRING_AGG (voltage.name, '|') AS vname 
         , STRING_AGG(catType.name, '|') AS catname
    FROM (
        SELECT  DISTINCT pinfos.id 
                        pinfos.plan_name,
                        voltage.name,
                        catType.name
        FROM [allocation_schematic.information].primary_infos pinfos
         LEFT JOIN [allocation_schematic.types].plans_into_type pit 
                ON pinfos.id = pit.id_plan
         LEFT JOIN [allocation_schematic.types].catenary_type catType 
                ON pit.id_type = catType.id
         LEFT JOIN [allocation_schematic.types].plans_into_voltage pot 
                ON pinfos.id = pot.id_plan
         LEFT JOIN [allocation_schematic.types].voltage voltage 
                ON pot.id_voltage = voltage.id
    )
    GROUP BY pinfos.id
    

    根据以下语句修改此查询:

    SELECT STRING_AGG(data)
    FROM (
       SELECT DISTINCT FROM ...
    )
    

    我用我的桌子测试过,它可以工作。

    我的员工表中的所有数据:

    运行我的演示查询:

    SELECT emp.deptno, STRING_AGG(emp.ename,',') AS ename from (
        SELECT DISTINCT ename, deptno  FROM employee) as emp
    GROUP BY emp.deptno
    

    更新:

    此查询未按预期工作。

    但是恭喜你已经解决了:

    由于我的 c# 程序中的字典,使用了多个查询并加入了它们,现在它工作正常

    希望这会有所帮助。

    【讨论】:

    • 感谢您的帮助,我认为我们的方法是正确的,但我仍然有错误。 1) 我必须在 ')' 和 'GROUP BY pinfos.id' 之间添加 AS ptest,因为它表示语法不正确。 2)现在使用“正确”语法,我遇到了 SQL 错误 4104:无法绑定多部分标识符“pinfos.id”。我尝试了一些没有成功的事情,也许你会看到问题出在哪里。
    • 我解决了所有错误,现在查询看起来像这样:pastebin.com/sDRCgQfh 不幸的是,它不起作用,我得到的结果和以前一样
    • 您是否运行SELECT DISTINCT pinfos.id AS planid, pinfos.plan_name AS planname... 语句来测试是否已排除重复值?
    • 不是真的,我只在运行 SELECT DISTINCT 查询时得到this
    • 我猜这是由more table left join引起的。可能SELECT DISTINCT只适用于一张表,或者尝试更改LEFT JOIN,再次测试。
    猜你喜欢
    • 2021-04-04
    • 2021-07-19
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 2016-09-07
    • 2013-09-19
    • 1970-01-01
    相关资源
    最近更新 更多