#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
что, вероятно, работает лучше, чем ответ с использованием подзапроса withCOUNT(*)
.
Ответ №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