Как удалить дубликаты после STRING_AGG?

Прежде всего, я должен сказать вам, что я новичок в SQL.

Я хочу выбрать всю информацию, связанную с моим ПЛАНОМ, благодаря его идентификатору, чтобы поместить их в DataGridView в моей программе на С#.

Мы можем повлиять на множители 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

введите здесь описание изображения

Обновление:

Этот запрос не работает должным образом.

Но поздравляю, что вы решили это:

Использовал несколько запросов и присоединился к ним благодаря словарю в моей программе С#, и теперь он отлично работает.

Надеюсь это поможет.

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
Извините за поздний ответ, я кое-что проверил (не сработало), но у меня не было достаточно времени, чтобы подумать об этой функции. Поэтому я просто использовал несколько запросов и присоединился к ним благодаря словарю в моей программе С#, и теперь он отлично работает. - person tsoich; 22.07.2019
comment
@tsoich Это не имеет значения. Поздравляем, что вы решили это! Я обновлю и добавлю это в свой ответ, тогда другие узнают, что ваша проблема решена. Можете ли вы подумать о том, чтобы пометить это как ответ? Это может быть полезно другим участникам сообщества. Спасибо. - person Leon Yue; 23.07.2019
comment
Готово, спасибо и вам. Возможно, пользователь найдет для этого SQL-решение. - person tsoich; 23.07.2019