簡體   English   中英

SQL查詢-選擇不滿足條件的元素

[英]Sql query - Select elements such that a condition is not met

我在sqlite中有此查詢:

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);

為此,您需要一個聚合查詢,因為您必須檢查列表中是否沒有介質值。 僅查看一行並不能提供足夠的信息:

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確保給定媒體沒有任何內容。

希望媒體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'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM