Как да изтрия дубликати след STRING_AGG?

Първо трябва да ви кажа, че съм начинаещ в SQL.

Искам да избера цялата информация, свързана с моя ПЛАН, благодарение на неговия идентификатор, за да ги поставя в DataGridView в моята C# програма.

Можем да повлияем на кратни voltage levels, catenary types и т.н... към този план и той ще се съхранява в таблица, наречена plans_into_voltage и plans_into_type там.

Така че, когато се опитам да избера цялата информация, свързана с план, ако той има множество типове напрежение и/или много контактна мрежа, той ще дублира редове като този:

пример за резултати

След това се опитах да 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

Резултати

Но аз го искам така:

това

Вече проверих това първо решение и този втори, но не разбирам как да го приложа с моята заявка.

Може ли някой да ми помогне с това, моля? Имам този проблем от 2 дни..

Благодаря !


person tsoich    schedule 12.07.2019    source източник


Отговори (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# и сега работи добре

Надявам се това да помогне.

person Leon Yue    schedule 15.07.2019
comment
Благодаря за помощта, мисля, че сме на прав път, но все още имам грешки. 1) Трябваше да добавя AS ptest между ')' и 'GROUP BY pinfos.id', защото казваше, че синтаксисът е неправилен. 2) Сега с правилния синтаксис имам SQL грешка 4104: Многочастният идентификатор pinfos.id не може да бъде обвързан. Опитах някои неща без успех, може би ще видите къде е проблемът. - person tsoich; 15.07.2019
comment
Разреших всички грешки, сега заявката изглежда така: pastebin.com/sDRCgQfh За съжаление не стана работа, имам същите резултати като преди - person tsoich; 15.07.2019
comment
Изпълнихте ли оператора SELECT DISTINCT pinfos.id AS planid, pinfos.plan_name AS planname..., за да проверите дали дублиращите се стойности са изключени? - person Leon Yue; 16.07.2019
comment
Всъщност не, получавам това, когато изпълнявам само заявката SELECT DISTINCT. - person tsoich; 16.07.2019
comment
Предполагам, че това е причинено от присъединяването на още таблица отляво. Може би SELECT DISTINCT работи само за една таблица или опитайте да промените LEFT JOIN, тествайте отново. - person Leon Yue; 16.07.2019
comment
Опитах всеки вид JOIN без успех. Мислех да направя алгоритъм/функция в SQL, за да изтрия между разделителите това, което надвишава. Мислите ли, че е добра идея? - person tsoich; 16.07.2019
comment
Всички примери, които намерихме, са работили за една таблица с дублирана стойност в ред. Тъй като SELECT STRING_AGG() FROM ( SELECT DISTINCT...) не работи за вашата маса 4, просто опитайте новата си идея сега. Ако алгоритъмът/функцията работи, това ще бъде много полезно за нас. - person Leon Yue; 17.07.2019
comment
Съжалявам, че отговарям късно, тествах някои неща (които не проработиха), но нямах достатъчно време да помисля за тази функция. Така че току-що използвах множество заявки и се присъединих към тях благодарение на речник в моята c# програма и сега работи добре - person tsoich; 22.07.2019
comment
@tsoich Няма значение. Поздравления, че сте го решили! Ще актуализирам и ще добавя това към отговора си, след което другите могат да разберат, че вашият проблем е решен. Можете ли да го маркирате като отговор? Това може да бъде от полза за други членове на общността. Благодаря ти. - person Leon Yue; 23.07.2019
comment
Готово, благодаря и на вас. Може би потребителят ще намери SQL решение за това - person tsoich; 23.07.2019