SQL连接和嵌套查询返回不同的记录

时间:2013-07-25 22:54:16

标签: sql sql-server

我目前正在开发一个项目,该项目应该采用一些任意输入数据,进行一些自然语言处理,并动态生成相应的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。

1 个答案:

答案 0 :(得分:1)

bksi 是对的,问题出在第一个查询中。

请注意:您可以在首次查询中获得所有公司的每日航班。

然后你RIGHT JOIN公司有从波士顿起飞的航班 - 这意味着你现在选择的公司每天都有航班(从任何地方)和(从任何时候)从波士顿起飞的航班,但不是每天都有来自波士顿的航班。

是的,第三次加入让你的公司同时有每日航班,有从波士顿出发的航班,并有飞往达拉斯的航班。

第二次查询,使用嵌套语句,为您的公司提供从波士顿到达拉斯的每日航班。