2013-12-12 4 views
2

Мне нужен запрос, чтобы найти Inspection/Component, который не получил запись «Рейтинг 6». Я буду вставлять новые записи, чтобы все Inspection/Component имели запись «Рейтинг 6» вместе с тем, что когда-либо было у других рейтингов.TSQL: Найдите необходимые отсутствующие записи

Рассмотрите следующие данные: 57646, 57652 и 57657: не Правильно, так как они не хватает своего рейтинга 6 записей. В этом примере данных эти три должны быть единственным объектом проверки/компонента, возвращаемым запросом.

InspectionID ComponentID  RatingTypeID 
138   57646   10 
138   57647   6 
138   57647   2 
138   57648   6 
138   57649   6 
138   57650   6 
138   57651   10 
138   57651   6 
138   57652   10 
138   57653   6 
138   57654   6 
138   57655   6 
138   57656   6 
138   57657   10 
+1

Просто интересно, если все эти комбинации нужен этот рейтинг тип, с какой целью она служит? Похоже, что это должно обрабатываться приложением или другой логикой запроса, если записи отсутствуют. – JeffO

ответ

4
SELECT * 
FROM YourTable A 
WHERE NOT EXISTS(SELECT 1 FROM YourTable 
       WHERE InspectionID = A.InspectionID 
       AND ComponentID = A.ComponentID 
       AND RatingTypeID = 6) 
+0

Perfect. Спасибо. –

2
SELECT A.InspectionID FROM MyTable AS A 
LEFT OUTER JOIN MyTable AS B 
ON A.InspectionID = B.InspectionID AND B.RatingTypeID = 6 
WHERE B.InspectionID IS NULL 
1

Это должно сделать работу всего за один проход.

SELECT src.* 
FROM 
(
    SELECT x.InspectionID, 
      x.ComponentID, 
      MAX(CASE WHEN x.RatingTypeID = 6 THEN 1 ELSE 0 END) AS HasRatingTypeID6 
    FROM dbo.MyTable x 
    GROUP BY x.InspectionID, x.ComponentID 
) src 
WHERE src.HasRatingTypeID6 = 1 
0
select * from YOURTABLE where componentId not in (select componentId from YOURTABLE where RatingTypeId=6) 
Смежные вопросы