我目前正在处理一个应该采取一些任意输入数据,做一些自然语言处理,并动态生成相应的SQL查询的项目。我还有一个“参考”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来匹配参考?
如果它的事项,我使用Microsoft SQL Server 2012
我认为第一个查询将返回从波士顿到达拉斯的所有每日航班,第二个将返回从波士顿到达拉斯的所有每日航班。您应该添加AND t0.airline_code = t2.airline_code来首先查询 – bksi
@bksi,这不完全正确,t0.airline_code因为传递性已经与t2.airline_code相同。 –