Выполните итерацию по нескольким пользовательским строкам и убедитесь, что они имеют один и тот же класс с SQL - PullRequest
0 голосов
/ 12 мая 2018
Server      User_ID     Class
_____________________________
Server 1    User 1      2
Server 2    User 1      2
Server 3    User 1      2
Server 1    User 2      3
Server 2    User 2      3
Server 3    User 2      3
Server 1    User 3      2
Server 2    User 3      2
Server 3    User 3      3

Все пользователи имеют записи в базе данных для каждого сервера, на котором они активны.Некоторые серверы имеют несоответствующий столбец класса для пользователя (в идеале это должно быть одинаковым для всех серверов для каждого пользователя). Я разбил его на части, и это то, что я должен сделать, чтобы заставить это работать.Мне нужно написать SQL-запрос, который выполняет следующие действия:

  1. Получить список уникальных идентификаторов пользователей
  2. Циклически перебирать каждый идентификатор пользователя и каждый из них:

    а.Сверьтесь с этой таблицей для всех строк, которые содержат идентификатор_пользователя

    b.Проверьте, что группа одного идентификатора пользователя и убедитесь, что класс одинаков во всех строках.

    с.Если это так, мне нужно поместить это в столбец с именем is_Mismatched либо с 0 для несоответствия, либо с 1 для несоответствия

Я мог бы сделать это, вызвав базу данных в powershell,но с 300 000+ строк это медленно и громоздко.Могу ли я сделать оператор T-SQL, который бы делал это более эффективно?

1 Ответ

0 голосов
/ 12 мая 2018

Вы действительно, действительно, не хотите зацикливаться в базе данных.
SQL работает в подходе, основанном на множестве - вам следует подумать о работе над набором строк, а не о работе над каждой строкой по отдельности.
Чтение эта статья о RBAR для получения дополнительной информации.

Теперь, если я понимаю ваши требования, вы, вероятно, должны сделать что-то вроде этого:

SELECT [User_ID], CASE WHEN COUNT(DISTINCT Class) = 1 THEN 0 ELSE 1 END As is_Mismatched
FROM Table
GROUP BY [User_ID]

Если вы хотите обновитьтаблицу, вы можете использовать общее табличное выражение с запросом выше, чтобы получить значения, и использовать его для обновления:

;WITH CTE AS
(
    SELECT [User_ID], CASE WHEN COUNT(DISTINCT Class) = 1 THEN 0 ELSE 1 END As is_Mismatched
    FROM Table
    GROUP BY [User_ID]
)

UPDATE t
SET t.is_Mismatched = cte.is_Mismatched
FROM Table As t
JOIN cte ON t.[User_ID] = cte.[User_ID]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...