我正在编写一个相当简单的SQL查询来修改IMDB数据库;它应该返回所有被归类为恐怖和喜剧的电影的清单,我通过创建一个恐怖列表,一个喜剧列表,然后从一个&#39中删除所有内容来完成。 ; s不在另一个。查询如下:
WITH
table_left AS (SELECT primary_names.name AS name, year, genre, title_id
FROM titles NATURAL JOIN primary_names NATURAL JOIN title_genres WHERE genre = 'Horror'),
table_right AS (SELECT primary_names.name AS name, year, genre, title_id
FROM titles NATURAL JOIN primary_names NATURAL JOIN title_genres WHERE genre = 'Comedy')
DELETE FROM table_right WHERE (title_id NOT IN (SELECT table_left.title_id))
SELECT name, year FROM table_right;
但是,这会在SELECT'""或#34;附近生成" ERROR:语法错误在查询的最后一行。我对SQL很新,但已多次查看语法并检查了一些指南,我无法理解出错的地方。在删除FROM语句之后不应该是逗号,我不认为我在任何不适当的地方都有逗号......它可能正在盯着我,但我&#39我不知所措,并希望听到任何建议。
答案 0 :(得分:2)
当您使用WITH
语法时,您可以声明多个table expressions,但是您可以使用一个SQL查询来关注它。
但是你有两个 - 一个DELETE后跟一个SELECT,两个语句之间没有语句终止符。这与SQL的任何语法规则都不匹配。
我可以评论另一种实现你想要的方式,列出两个类别的电影,就是做一个自我加入。
SELECT p.name, t.year, t.title_id
FROM titles AS t
INNER JOIN title_genres AS g1 ON t.title_id = g1.title_id AND g1.genre = 'Horror'
INNER JOIN title_genres AS g2 ON t.title_id = g2.title_id AND g2.genre = 'Comedy'
INNER JOIN primary_names AS p ON t.title_id = p.title_id
如果您使用SQL编码,您确实需要学习如何使用JOIN
。不这样做就像使用Java或Ruby之类的其他语言而不理解循环。我并不是说连接就像循环,只是连接是SQL语言的基础部分,你需要知道如何使用它们。