SQL 交集 - 语法错误

Posted

技术标签:

【中文标题】SQL 交集 - 语法错误【英文标题】:SQL intersection - error in syntax 【发布时间】:2016-02-21 22:40:11 【问题描述】:

我正在尝试搜索从伦敦出发并抵达巴黎的航班。有关城市的信息位于 Airport 表中,而出发和到达机场的缩写位于 Flight 中。

这是我的问题代码:

SELECT flightNo,flightCompany
FROM Flight
JOIN Airport
ON Airport.airportId=Flight.depAirport
WHERE Airport.city='London'

INTERSECT

SELECT flightNo,flightCompany
FROM Flight
JOIN Airport
ON Airport.airportId=Flight.arrAirport
WHERE Airport.city='Paris';

它返回 3 个错误 -

SQL 状态:HY000 错误代码:1000 SQL 语句语法错误 SQL 状态:HY000 错误代码:1000 SQL 状态:HY000 错误代码:1000 语法错误,意外 $end,期望 BETWEEN 或 IN 或 SQL_TOKEN_LIKE

【问题讨论】:

您使用的是哪个 DBMS? 我正在使用 Libreoffice 这是一个客户端/前端工具,但您使用的是哪个 DBMS? 什么是语法错误? imgur.com/a/97VxC 这些只是一些例子 【参考方案1】:

改用JOINs 重写查询怎么样?

SELECT f.flightNo, f.flightCompany
FROM Flight f JOIN
     Airport ad
     ON ad.airportId = f.depAirport AND ad.city = 'London' JOIN
     Airport aa
     ON aa.airportId = f.arrAirport AND aa.city = 'Paris';

或者,使用EXISTS

SELECT f.*
FROM Flight f
WHERE EXISTS (SELECT 1
              FROM Airport ad
              WHERE ad.airportId = f.depAirport AND ad.city = 'London'
             ) AND
      EXISTS (SELECT 1
              FROM Airport aa
              WHERE aa.airportId = f.arrAirport AND aa.city = 'Paris'
             );

【讨论】:

我知道它是如何工作的,但由于某种原因它没有输出任何结果(应该显示机场的组合)。 我不确定是否应该更改第二个代码中的任何内容,因为我对 SQL 有点陌生,但是按照书面形式复制和运行它会出现错误 - 无法加载数据内容,表在语句中找不到。 @Sick0ne 。 . .第二个查询有“机场”。也许您的数据库对表名区分大小写。 感谢您的回答。第二个查询按预期工作。不过决定采用以下方法:SELECT F.flightNo,F.FlightCompany FROM Flight F, Airport A1, Airport A2 WHERE (F.depAirport=A1.airportId AND A1.city='London') AND (F.arrAirport=A2.airportId AND A2.city='Paris') @Sick0ne 。 . .你应该学会使用正确的显式JOIN 语法:不要在FROM 子句中使用逗号。【参考方案2】:

使用默认的 LibreOffice Base / HSQLDB 1.8 设置引用规则和区分大小写是很棘手的。以下是您需要做的:

SELECT "flightNo","flightCompany"
FROM "Flight"
JOIN "Airport"
ON "Airport"."airportId"="Flight"."depAirport"
WHERE "Airport"."city"='London'
INTERSECT
SELECT "flightNo","flightCompany"
FROM "Flight"
JOIN "Airport"
ON "Airport"."airportId"="Flight"."arrAirport"
WHERE "Airport"."city"='Paris';

或者更好,修改戈登的回答如下:

SELECT F."flightNo", F."flightCompany"
FROM "Flight" F JOIN
     "Airport" AD
     ON AD."airportId" = F."depAirport" AND AD."city" = 'London' JOIN
     "Airport" AA
     ON AA."airportId" = F."arrAirport" AND AA."city" = 'Paris';

【讨论】:

看,这就是 Libre Office 自动为你做的事情。如果你保存一个文件,它会自己添加引号 - 如果你再次打开你的查询,它会看起来那样。最后决定这样做(是的,戈登的第二个代码有效):SELECT F.flightNo,F.FlightCompany FROM Flight F, Airport A1, Airport A2 WHERE (F.depAirport=A1.airportId AND A1.city='London') AND (F.arrAirport=A2.airportId AND A2.city='Paris')

以上是关于SQL 交集 - 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

oracle如何检查sql语法错误

MySQL 语法错误 |您的 SQL 语法有错误;

INSERT INTO 语句的语法错误

ogr执行sql语句,sql中有中文时包语法错误

我的 SQL 错误:错误 1064:您的 SQL 语法有错误;

SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 - LARAVEL