#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 2017STRING_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. здесь я получаю все значения в этой строке пользователей, это не приведет к совпадающим результатам, но все строки заполнены множеством идентификаторов, и все они одинаковы для всех строк