我目前正在开发一个项目,该项目应该采用一些任意输入数据,进行一些自然语言处理,并动态生成相应的SQL查询。我还有一组“参考”SQL查询,我可以使用它来比较我的SQL,以验证SQL生成是否准确。
这是我生成的一个这样的SQL查询:
SELECT DISTINCT t0.airline_code
FROM (
SELECT airline.*
FROM airline, flight
WHERE (
( airline.airline_code = flight.airline_code )
AND
( flight.flight_days = 'DAILY' )
)
)
AS t0
INNER JOIN (
SELECT airline.*
FROM airline, flight, airport_service, city
WHERE (
( airline.airline_code = flight.airline_code )
AND
( flight.from_airport = airport_service.airport_code )
AND
( airport_service.city_code = city.city_code )
AND
( city.city_name = 'BOSTON' )
)
)
AS t1
ON t0.airline_code = t1.airline_code
INNER JOIN (
SELECT airline.*
FROM airline, flight, airport_service, city
WHERE (
( airline.airline_code = flight.airline_code )
AND
( flight.to_airport = airport_service.airport_code )
AND
( airport_service.city_code = city.city_code )
AND
( city.city_name = 'DALLAS' )
)
)
AS t2
ON t1.airline_code = t2.airline_code;
运行此命令将返回以下列:
airline_code
------------
AA
CO
HP
TW
DL
NW
UA
US
但是,引用SQL返回的结果略有不同:
SELECT DISTINCT airline.airline_code
FROM airline
WHERE airline.airline_code IN
(SELECT flight.airline_code
FROM flight
WHERE (flight.flight_days = 'DAILY'
AND (flight.from_airport IN
(SELECT airport_service.airport_code
FROM airport_service
WHERE airport_service.city_code IN
(SELECT city.city_code
FROM city
WHERE city.city_name = 'BOSTON'))
AND flight.to_airport IN
(SELECT airport_service.airport_code
FROM airport_service
WHERE airport_service.city_code IN
(SELECT city.city_code
FROM city
WHERE city.city_name = 'DALLAS')))));
结果:
airline_code
------------
AA
DL
TW
UA
US
显然,两者的不同之处在于第一个使用连接,而第二个使用嵌套的SQL语句。但是,这似乎不会导致我正在使用的其他生成的SQL /引用SQL出现任何问题,这些SQL结构类似(生成的SQL使用连接,引用SQL是嵌套的)。
我对SQL很新,对数据库几乎一无所知,所以我可能会遗漏一些愚蠢明显的东西,但对于我的生活,我不明白为什么这两个SQL语句会返回不同的结果。它们在功能上看起来完全相同,尽我所知。有人知道我做错了什么,以及如何修复生成的SQL以匹配引用?
如果重要,我正在使用Microsoft SQL Server 2012。
答案 0 :(得分:1)
bksi 是对的,问题出在第一个查询中。
请注意:您可以在首次查询中获得所有公司的每日航班。
然后你RIGHT JOIN
公司有从波士顿起飞的航班 - 这意味着你现在选择的公司每天都有航班(从任何地方)和(从任何时候)从波士顿起飞的航班,但不是每天都有来自波士顿的航班。
是的,第三次加入让你的公司同时有每日航班,有从波士顿出发的航班,并有飞往达拉斯的航班。
第二次查询,使用嵌套语句,为您的公司提供从波士顿到达拉斯的每日航班。