2013-07-25 58 views
1

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

+1

我认为第一个查询将返回从波士顿到达拉斯的所有每日航班,第二个将返回从波士顿到达拉斯的所有每日航班。您应该添加AND t0.airline_code = t2.airline_code来首先查询 – bksi

+0

@bksi,这不完全正确,t0.airline_code因为传递性已经与t2.airline_code相同。 –

回答

1

bksi是正确的,问题是在第一个查询。

看:你会得到所有的公司在第一次查询每天有航班。

那你RIGHT JOIN有哪些公司有从波士顿出发的航班吗?这意味着您现在是从选择有每日航班(从任何地方)和(随时)从波士顿出发的公司,但不是每天从波士顿出发的航班。

是的,第三次加入让您的公司同时拥有每日航班,从波士顿出发的航班以及前往达拉斯的航班。

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