比较 sql 中的复合键

comparing composite keys in sql

我好像不知道怎么写这个。我有四张表:一份主要的奖项列表,然后是实际颁发给演员、制片人和电视节目的奖项。后一组可通过复合键识别。我想列出所有未颁发的奖项。这是我到目前为止所做的。

SELECT AWARD.AWARD_NAME, AWARD.AWARD_TYPE, AWARD.AWARD_YEAR
FROM AWARD
WHERE NOT EXISTS
  (
  SELECT *
  FROM AWARD AW, ACTORAWARD ACAW
  WHERE (AW.AWARD_NAME = ACAW.AWARD_NAME AND AW.AWARD_TYPE = ACAW.AWARD_TYPE AND AW.AWARD_YEAR = ACAW.AWARD_YEAR)
  )

AND NOT EXISTS
  (
  SELECT *
  FROM AWARD AW, PRODAWARD PRAW
  WHERE (AW.AWARD_NAME = PRAW.AWARD_NAME AND AW.AWARD_TYPE = PRAW.AWARD_TYPE AND AW.AWARD_YEAR = PRAW.AWARD_YEAR)
  )

AND NOT EXISTS
  (
  SELECT *
  FROM AWARD AW, SHOWAWARD SHAW
  WHERE (AW.AWARD_NAME = SHAW.AWARD_NAME AND AW.AWARD_TYPE = SHAW.AWARD_TYPE AND AW.AWARD_YEAR = SHAW.AWARD_YEAR)
  )

语法很好,所以我不担心,但不存在不起作用,我无法使用 IN 同时比较三个值,所以我能做些什么来解决这个问题?

您不需要子选择中的联接。改用相关子查询:

SELECT aw.award_name, aw.award_type, aw.award_year
FROM award aw
WHERE NOT EXISTS (SELECT *
                  FROM actoraward acaw
                  WHERE aw.award_name = acaw.award_name 
                    AND aw.award_type = acaw.award_type 
                    AND aw.award_year = acaw.award_year)
  AND NOT EXISTS (SELECT *
                  FROM prodaward praw
                  WHERE aw.award_name = praw.award_name 
                    AND aw.award_type = praw.award_type 
                    AND aw.award_year = praw.award_year)
  AND NOT EXISTS (SELECT *
                  FROM showaward shaw
                  WHERE aw.award_name = shaw.award_name 
                    AND aw.award_type = shaw.award_type 
                    AND aw.award_year = shaw.award_year);

and I can't compare three values simultaneously using IN

是的,您可以使用 IN 子句比较多个值:

SELECT *
FROM award aw
WHERE (aw.award_name, aw.award_type, aw.award_year) 
      NOT IN (  
                SELECT acaw.award_name, acaw.award_type, acaw.award_year
                FROM actoraward acaw
                UNION 
                SELECT praw.award_name, praw.award_type, praw.award_year
                FROM prodaward praw
                UNION 
                SELECT shaw.award_name, shaw.award_type, shaw.award_year
                FROM showaward shaw
             )

这很可能会比带有 EXISTS

的版本慢