2014-12-13 47 views
0

我有這個疑問在sqlite的元素:SQL查詢 - 選擇這樣一個條件不符合

SELECT 
    'L_MEDIA_ARTIST'.'MEDIA_ID' 
FROM \ 
    'L_MEDIA_ARTIST', 
    'L_ARTIST_CAT', 
    'ARTIST_CAT' 
WHERE 
    'L_ARTIST_CAT'.'ART_ID' == 'L_MEDIA_ARTIST'.'ART_ID' 
AND 
    'L_ARTIST_CAT'.'ART_CAT_ID' == 'ARTIST_CAT'.'ID' 
AND 
    ('ARTIST_CAT'.'NAME' == 'SINGER' OR 'ARTIST_CAT'.'NAME' == 'ACTOR') 

這只是選擇所有的媒體ID使得藝術家有標籤「SINGER」中的至少一個或'ACTOR'。

如何更改此查詢以獲取所有媒體列表,例如演員既沒有標籤'SINGER'也沒有標籤'ACTOR'?

相關的表被建成具有如下:

CREATE TABLE 'L_MEDIA_ARTIST' (
'MEDIA_ID' INTEGER, 
'ART_ID' INTEGER, 
FOREIGN KEY('MEDIA_ID') REFERENCES MEDIA('ID'), 
FOREIGN KEY('ART_ID') REFERENCES ARTIST('ID'), 
UNIQUE('MEDIA_ID', 'ART_ID')); 

CREATE TABLE 'L_ARTIST_CAT' (
'ART_ID' INTEGER, 
'ART_CAT_ID' INTEGER, 
FOREIGN KEY('ART_ID') REFERENCES ARTIST('ID'), 
FOREIGN KEY('ART_CAT_ID') REFERENCES ARTIST_CAT('ID'), 
UNIQUE('ART_ID', 'ART_CAT_ID')); 

CREATE TABLE 'ARTIST_CAT' (
'ID' INTEGER PRIMARY KEY, 
'NAME' TEXT NOT NULL UNIQUE); 

回答

2

需要在此聚集查詢,因爲你必須檢查,對於媒體的價值沒有是在列表中。只是在尋找一個行不提供足夠的信息:

SELECT l.MEDIA_ID 
FROM L_MEDIA_ARTIST l JOIN 
    L_ARTIST_CAT ac 
    ON l.ART_ID = ac.ART_ID JOIN 
    ARTIST_CAT c 
    ON ac.ART_CAT_ID = c.ID 
GROUP BY l.MEDIA_ID 
HAVING SUM(CASE WHEN c.Name IN ('SINGER', 'ACTOR') THEN 1 ELSE 0 END) = 0; 

注意,我也是固定的查詢:

  • 推出適當join語法。你應該學習現代連接語法。
  • 添加了表別名,以便查詢更易於編寫和閱讀。
  • 刪除了引起語法錯誤的表名和列名的單引號。

HAVING子句計數在數據中找到「SINGER」和「ACTOR」的次數。 = 0確保給定的媒體不存在。

1

你做想可以用這個查詢中檢索到的介質ID:(這是與您的第一個查詢)

SELECT L_Media_Artist.Media_ID 
FROM L_Media_Artist 
JOIN L_Artist_Cat USING (Art_ID) 
JOIN Artist_Cat ON L_Artist_Cat.Art_Cat_ID = Artist_Cat.ID 
WHERE Artist_Cat.Name IN ('SINGER', 'ACTOR') 

所以,你想那是所有媒體不是其中之一:

SELECT ID 
FROM Media 
WHERE ID NOT IN (SELECT L_Media_Artist.Media_ID 
       FROM L_Media_Artist 
       JOIN L_Artist_Cat USING (Art_ID) 
       JOIN Artist_Cat ON L_Artist_Cat.Art_Cat_ID = Artist_Cat.ID 
       WHERE Artist_Cat.Name IN ('SINGER', 'ACTOR'))