2016-08-17 2 views
2

У меня есть этот простой запрос (TSQL) -Второе условие в запросе SELECT,

SELECT IdTour, Tour, TourOrder, IdContent 
    FROM View_ToursListContentId 
    WHERE (IdContent = 3) OR (IdContent = 4) 
    ORDER BY TourOrder DESC, Tour 

Вот результат

58 Air & Style Tour     2015/16 NULL 3 
48 FIS Europa Cup      2015/16 NULL 3 
46 FIS World Cup Tour     2015/16 NULL 3 
131 KDC Grand Slam Regional Qualifiers 2016  NULL 3 
59 Swatch Freeride World Tour   2016  NULL 3 
77 World Rookie Tour     2015/16 NULL 3 
57 World Snowboard Tour    2015/16 NULL 3 
45 X Games       2016  NULL 3 
45 X Games       2016  NULL 4 

Что мне нужно сделать, это. Если внутри результата IdTour с IdContent = 3 не отображается тот же IdTour с IdContent = 4. (Покажите только IdTour только с IdContent = 4, если нет IdTour с IdContent = 3 - в моем случае показывается только один IdTour 45 с IdContent 3)

Что является самым простым и быстрым способом, как я мог его выполнить?

Thanx много

+0

Добавить ожидаемый результат, как хорошо! – jarlh

ответ

2

Один из способов заключается в использовании NOT EXISTS:

SELECT IdTour, Tour, TourOrder, IdContent 
FROM View_ToursListContentId t1 
WHERE (IdContent = 3) OR 
     ((IdContent = 4) AND NOT EXISTS (SELECT 1 
             FROM View_ToursListContentId t2 
             WHERE t1.IdTour = t2.IdTour AND 
              t2.IdContent = 3)) 
ORDER BY TourOrder DESC, Tour 

Оператор NOT EXISTS отфильтровывает записи с IdContent = 4 в случае записи с тем же IdTour и IdContent = 3 существует.

-1

вы должны просто использовать group by IdContent в запросе как

SELECT IdTour, Tour, TourOrder, IdContent 
    FROM View_ToursListContentId 
    WHERE (IdContent = 3) OR (IdContent = 4) 
group by IdContent 
    ORDER BY TourOrder DESC, Tour 
+3

Это даже не запускается, и даже если бы это было - это не дало бы правильного результата ... – Milney

+1

Не говоря уже о том, что вы действительно должны объяснить свой ответ, а не просто вставлять код. – logixologist

0

Вы можете использовать функцию окна, чтобы получить доступный низкий IdContent для этого IdTour:

SELECT IdTour, 
     Tour, 
     TourOrder, 
     IdContent, 
     MinIdContent = MIN(IdContent) OVER(PARTITION BY IdTour) 
FROM View_ToursListContentId 
WHERE IdContent IN (3, 4); 

Тогда, если это 3, то вы выберите только 3, если это 4, тогда вы выбираете только 4 или более просто, выберите только IdContent, который соответствует минимуму:

SELECT IdTour, Tour, TourOrder, IdContent 
FROM ( SELECT IdTour, 
        Tour, 
        TourOrder, 
        IdContent, 
        MinIdContent = MIN(IdContent) OVER(PARTITION BY IdTour) 
      FROM View_ToursListContentId 
      WHERE IdContent IN (3, 4) 
     ) AS t 
WHERE IdContent = MinIdContent; 

ПОЛНЫЙ ПРИМЕР

WITH View_ToursListContentId AS 
( SELECT IdTour, Tour, TourOrder, IdContent 
    FROM (VALUES 
       (58, 'Air & Style Tour 2015/16', NULL, 3), 
       (48, 'FIS Europa Cup 2015/16', NULL, 3), 
       (46, 'FIS World Cup Tour 2015/16', NULL, 3), 
       (131, 'KDC Grand Slam Regional Qualifiers 2016', NULL, 3), 
       (59, 'Swatch Freeride World Tour 2016', NULL, 3), 
       (77, 'World Rookie Tour 2015/16', NULL, 3), 
       (57, 'World Snowboard Tour 2015/16', NULL, 3), 
       (45, 'X Games 2016', NULL, 3), 
       (45, 'X Games 2016', NULL, 4) 
      ) t (IdTour, Tour, TourOrder, IdContent) 
) 
SELECT IdTour, Tour, TourOrder, IdContent 
FROM ( SELECT IdTour, 
        Tour, 
        TourOrder, 
        IdContent, 
        MinIdContent = MIN(IdContent) OVER(PARTITION BY IdTour) 
      FROM View_ToursListContentId 
      WHERE IdContent IN (3, 4) 
     ) AS t 
WHERE IdContent = MinIdContent; 
0
select * from (
select row_number() over (partition by IdTour, Tour, TourOrder order by IdContent) rownum, 
IdTour, Tour, TourOrder, IdContent from View_ToursListContentId)src 
where rownum=1 
Смежные вопросы