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】:改用JOIN
s 重写查询怎么样?
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 交集 - 语法错误的主要内容,如果未能解决你的问题,请参考以下文章