Сравните данные трех столбцов и установите флаг в четвертом столбце

#sql #sql-server

Вопрос:

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

У меня есть структура таблицы выше, где 1-я, 3-я и 5-я строки одинаковы. В таблице может быть много записей, но я использовал ее только в качестве примера. Поэтому, если данные столбца A, столбца B и столбца C совпадают, я должен обновить столбец флага как Да, иначе Нет. Я использую SQL Server 2019.

Я попытался обновить единственное » Да » в столбце флага со следующим запросом:

 update table set Flag='Yes' where (SELECT Column A, Column B, Column C, COUNT(*) FROM Table GROUP BY Column A, Column B, Column C HAVING COUNT(*)>1 )
 

Но получаю следующую ошибку:

Выражение не булева типа, указанное в контексте, где ожидается условие, рядом с»)».

Любая помощь будет признательна.

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

1. «Но это не работает» При размещении вопроса вам нужно объяснить , почему он не работает. Мы не можем запустить ваш SQL, у нас нет доступа к вашей системе, и у нас нет доступных образцов данных, которые мы можем использовать, поэтому «Это не работает» мало что говорит нам. Если вы получаете сообщение об ошибке, включите его в свой вопрос. Если вы не получаете ожидаемых результатов, объясните, каковы эти результаты и почему они не являются тем, чего вы хотите/чего вы действительно хотите. Если вы получаете нежелательное поведение, расскажите нам, что это за поведение и почему это не то, чего вы хотите.

2. @Larnu, обновил вопрос, обязательно об этом позаботимся.

Ответ №1:

Обновляемый CTE, похоже, то, что вам нужно:

 WITH CTE AS(
    SELECT Flag,
           COUNT(*) OVER (PARTITION BY ColumnA, ColumnB, ColumnC) AS DupeCount
    FROM dbo.YourTable)
UPDATE CTE
SET Flag = CASE DupeCount WHEN 1 THEN 'No' ELSE 'Yes' END;
 

Ответ №2:

Если вы хотите обновить, вы можете использовать обновляемый CTE:

 with toupdate as (
      select t.*, count(*) over (partition by a, b, c) as cnt
      from t
     )
update toupdate
    set flag = 'yes'
    where cnt > 1;
 

Я бы предложил исправить таблицу, чтобы строки не дублировались на 100%, но, возможно, у вас есть другие столбцы, которые не упомянуты в вопросе.

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

1. На самом деле именно так данные сохраняются в таблице и не могут изменить структуру таблицы. Я думаю, обязательные столбцы, разделяемые с вопросом? Я ценю ваши отзывы, спасибо.

2. @Shatanu . . . Учитывая, что ваш вопрос касается только присвоения «да» дублированным строкам, я удивлен, что вы не приняли этот ответ.

3. ,Я специально упомянул : я должен обновить столбец флага как Да, иначе Нет., и даже на скриншоте я обновил то же самое. Я уже упоминал, что я просто попытался обновить » Да «с помощью данного запроса, но это не работает, но я должен обновить» Да » или «Нет».