使用SQL查询获取奇怪的语法错误

时间:2018-03-01 04:36:34

标签: mysql sql database

我正在编写一个相当简单的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我不知所措,并希望听到任何建议。

1 个答案:

答案 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语言的基础部分,你需要知道如何使用它们。