Удаление данных в том же столбце

#sql #sql-server-2008

#sql #sql-server-2008

Вопрос:

Я не уверен, как объяснить мою проблему, поэтому я показываю примерные данные.

У меня есть следующая таблица

 ---------------------------------
|RecID |TypeOfData  |Data       |
|21    |Label       |Name       |
|21    |Data        |Sam        |
|22    |Label       |Name       |
|23    |Label       |Name       |
|23    |Data        |Nimble     | 
  

Я хочу удалить все те записи меток, под которыми нет данных.
Итак, в приведенном выше примере необходимо удалить RecId = 22.

Пожалуйста, помогите мне с этим.

БД — это SQL Server 2008.

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

1. @Shiva См. RecId 21 и RecId 22. У доцента с идентификатором Rec есть данные под меткой.

Ответ №1:

может быть, вы можете использовать подвыборку, где количество Rec_id равно = 1

   delete from my_table 
  where Rec_id in (select RecID from my_table 
                   group by RecId 
                   having count(*) =1)
 and TypeOdData = 'Label' 
  

Ответ №2:

Это то, что вы хотите?

 delete t
    from t
    where t.typeofdata = 'Label' and
          not exists (select 1
                      from t t2
                      where t2.recid = t.recid and t2.typeofdata = 'Data'
                     );
  

«ниже» ничего не значит в реляционной таблице, потому что таблица представляет собой неупорядоченный набор.

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

1. @NimbleFungus . , , Есть причина, по которой вы не приняли этот ответ? Вы можете выбрать любой ответ, который вам нравится, но мне любопытно.

2. Я выбираю другое вместо этого, поскольку я не хотел не использовать NOT Exist . Это единственная причина. Спасибо …!! я хотел отметить оба как ответ.

3. @NimbleFungus . , , Это позор, потому NOT EXISTS что, вероятно, работает лучше, чем ответ с использованием подзапроса with COUNT(*) .

Ответ №3:

 WITH CTE(TypeOfData, Data, Rn) 
AS
(
SELECT [TypeOfData], [Data], 
    RN = ROW_NUMBER() OVER(PARTITION BY TypeOfData, DATA ORDER BY TypeOfData,Data)
FROM tbl
WHERE TypeOfData ='label'
)
DELETE FROM CTE WHERE RN > 1