2014-04-28 113 views
0

我有兩個表。根據表連接結果排除查詢中的記錄

視頻; ID, 藝術家, 標題

runlog; VideoID,'加入videos.ID datetime

我想在視頻表上運行查詢,不包括記錄在三個條件。 (作爲例子。我有多個條件,但如果我得到這些幫助,我也許可以弄清楚一切了。

  • 任何視頻,顯示了在Runlog在過去一小時內將不會在結果中顯示
  • 任何在過去一小時內有在運行日誌中顯示的視頻的藝術家將不會有任何其他相同藝術家的記錄在查詢中完全顯示
  • 任何藝術家的視頻已顯示在runlog三次在過去24小時內沒有任何其他記錄由同一位藝術家在查詢中完全顯示

這使我得到了第一個結果要求,但我覺得它可以寫得更好。

SELECT ID,Artist, Title FROM 
    videos join runlog on runlog.videoID = videos.id 
    where 
    (select COUNT(*) from runlog where datetime > DATEADD(hh,-12,GETDATE()) 
    and runlog.videoID = videos.id) = 0 
    order by Artist, Title 

第二個要求我無法弄清楚如何放在一起的查詢。

+0

只是'和'他們seprate子查詢在:例如'如果(subquery1)和(subquery2)和(subquery3)' – RezaRahmati

+0

我想,如果我有一個runlog VideoID的,我想查詢視頻表EXCLUDING具有與該視頻ID匹配的藝術家的任何記錄。所以說,如果我運行麥當娜的視頻videoID 10,我不希望任何其他麥當娜視頻出現在視頻查詢中。我不知道如何編寫一個子查詢,排除來自藝術家的記錄後,它必須加入找到該字段。 –

回答

0

此查詢強制執行你的拿鐵兩個約束條件明確地並且第一個隱含地執行(強制第二個隱含地執行第一個約束條件)。它沒有經過測試,但它應該讓你走上正確的軌道。

select ID, Artist, Title 
from Video 
where Artist not in (
    select V.Artist 
    from Video V, Runlog R 
    where V.ID = R.VideoID 
    and R.datetime > dateadd(hour, -1, getdate()) 
    union 
    select V.Artist 
    from Video V, Runlog R 
    where V.ID = R.VideoID 
    and R.datetime > dateadd(hour, -24, getdate()) 
    group by V.Artist 
    having count(*) > 2 
); 
+0

更好!我不知道是什麼花了我很長時間才報名參加這個論壇。非常感謝! –

+0

安德魯和@CharlesKiel這個答案與我的不同嗎? –

+0

你給我的那個人給了我重複的東西。我在我的視頻表中有一個主鍵,但是我收到了與該查詢重複的記錄。我在該數據庫中沒有重複的記錄。它與它是如何處理runlog –

0
SELECT ID, Artist, Title 
    FROM videos v join runlog l on l.videoID = v.id 
    WHERE 
     -- 1. All in past hour will not show 
     datetime < DATEADD(hour,-1,GETDATE()) 
     -- 2. 
     and not exists 
     (select 1 
      from videos v2 join runlog l2 on l2.videoID = v2.id 
      where v2.Artist = v1.Artist and datetime > DATEADD(hour,-1,GETDATE()) 
     ) 
     -- 3. 
     and not exists 
     ( 
      select 1 
      from 
      (
       select count(1) recordCount 
       from videos v3 join runlog l3 on l3.videoID = v3.id 
       where v3.Artist = v1.Artist and datetime > DATEADD(hour,-24,GETDATE()) 
      ) 
      where recordCount>=3 
     ) 
    order by Artist, Title 

OR

SELECT ID, Artist, Title 
     FROM videos v join runlog l on l.videoID = v.id 
     WHERE 
      -- 1. All in past hour will not show 
      datetime < DATEADD(hour,-1,GETDATE()) 
      and v1.Artist in 
     (
        -- 2. 
      select Artist 
      from videos v2 join runlog l2 on l2.videoID = v2.id 
      where datetime > DATEADD(hour,-1,GETDATE()) 
      union all 
        -- 3. 
      select Artist 
      from videos v3 join runlog l3 on l3.videoID = v3.id 
      where datetime > DATEADD(hour,-24,GETDATE()) 
      group by v3.Artist having count(1) >= 3 
     ) 
0
SELECT ID, Artist, Title 
FROM Videos V 
WHERE V.ARTIST NOT IN 
(SELECT V2.Artist 
     FROM RunLog R 
     INNER JOIN Videos V2 ON V2.ID = R.VideosID 
     WHERE dateTime >= DateAdd(hh, -1, GetDate()) 
UNION ALL 
SELECT V3.Artist 
     FROM RunLog R 
     INNER JOIN Videos V3 ON V3.ID = R.VideosID 
     WHERE dateTime >= DateAdd(hh, -24, GetDate()) 
     GROUP BY V3.Artist 
     HAVING Count(*) >= 3 
    ) 
) 

相同的查詢,也可以使用NOT EXISTS

SELECT ID, Artist, Title 
FROM Videos V 
WHERE NOT EXISTS 
(SELECT 1 
     FROM RunLog R 
     INNER JOIN Videos V2 ON V2.ID = R.VideosID 
     WHERE dateTime >= DateAdd(hh, -1, GetDate()) 
     AND V2.Artist = V.Artist 
UNION ALL 
SELECT 1 
     FROM RunLog R 
     INNER JOIN Videos V3 ON V3.ID = R.VideosID 
     WHERE dateTime >= DateAdd(hh, -24, GetDate()) 
     AND V3.Artist = V.Artist 
     GROUP BY V3.Artist 
     HAVING Count(*) >= 3 
    ) 
) 

條件2會自動滿足條件完成1

+0

是的!使用第二個。非常感謝! –

+0

我感謝你的幫助@ anup-agrawal我現在唯一的問題是,我在查詢結果中得到重複。爲什麼會這樣? –

+0

看起來您在'Videos'表中有重複的記錄。 –