【问题标题】:Getting an Odd Syntax Error With SQL Query使用 SQL 查询出现奇怪的语法错误
【发布时间】:2018-03-01 04:36:34
【问题描述】:

我正在编写一个相当简单的 SQL 查询来修改 IMDB 数据库;它应该返回所有被归类为恐怖和喜剧的电影的列表,我通过创建一个恐怖列表、一个喜剧列表,然后从另一部中删除所有内容来完成此操作。查询如下:

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' 处或附近的语法错误”。我对 SQL 很陌生,但是已经多次检查语法并检查了一些指南,但我就是不明白出了什么问题。在 DELETE FROM 语句之后不应该有逗号,我认为我在任何不合适的地方都没有逗号......它可能会盯着我的脸,但我很茫然,并且会喜欢听到任何建议。

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

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

    【讨论】:

    • 很好的答案,你是对的,我确实仍然需要练习 SQL 连接。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2014-04-12
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多