Используйте функцию STUFF для вывода только тех значений, которые соответствуют столбцу в таблице

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я использую функцию stuff как:

 STUFF((SELECT DISTINCT ', '   CAST(id as varchar)
       FROM users 
       WHERE userID = depatments.userID 
       FOR XML PATH('')), 1, 1, '') AS Users
  

У каждого пользователя есть один отдел, я хочу вернуть те значения таблицы users, которые соответствуют этому отделу, но вместо этого он возвращает все значения всех строк в этом столбце. Как я могу это исправить?

Комментарии:

1. Примеры данных и ожидаемые результаты помогут. Особенно, если вы предоставили образцы данных в формате DDL / DML для тестирования.

2. Вредные привычки: объявление VARCHAR без (length) — вы всегда должны указывать длину для любых varchar переменных и параметров, которые вы используете

3. Какую версию SQL Server вы используете? Единственное, что STUFF нужно сделать, это удалить начало , . Агрегирование строк выполняется с помощью XML PATH() . Введен SQL Server 2017 STRING_AGG , поэтому XML-путь больше не нужен

Ответ №1:

Во-первых, я предполагаю, что у пользователей есть id , но нет userid . Итак:

 STUFF((SELECT DISTINCT ', '   CAST(id as varchar(255))
       FROM users u
       WHERE u.id = departments.userID 
       FOR XML PATH('')
      ), 1, 1, ''
     ) AS Users
  

Примечания:

  • Никогда не используйте varchar (или связанные типы) без длины. Длина SQL Server по умолчанию зависит от контекста и может быть недостаточно большой.
  • Всегда уточняйте все ссылки на столбцы в запросе, чтобы было ясно, откуда они берутся. Если вы используете u.userid - departments.userId в своем запросе, то вы получили бы ошибку и просто исправили код.
  • Используйте псевдонимы таблиц, чтобы запросы было легче записывать и читать.

Комментарии:

1. здесь я получаю все значения в этой строке пользователей, это не приведет к совпадающим результатам, но все строки заполнены множеством идентификаторов, и все они одинаковы для всех строк