2016-08-17 68 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 

我需要做的是。如果ther在IdContent = 3的結果IdTour中,則不顯示與IdContent = 4相同的IdTour。(僅在IdContent = 4時顯示IdTour,如果IdContent = 3時沒有相同的IdTour - 在我的情況下,只顯示一個IdTour 45與IdContent 3)

什麼是最簡單和最快的方式,我怎麼能實現它?

感謝名單了很多

+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記錄案件的同一IdTourIdContent = 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