大型记录集的复杂SQL查询

时间:2018-09-28 21:34:02

标签: sql ms-access

我有3张桌子。让我们先解释第一个

tblDistance: (airport1, airport2, distance) // airport1 and airport 2 are airport codes

此表包含美国所有机场之间的距离(以英里为单位),总共3745个机场,并且该距离是使用嵌套的for循环计算的,并且每个循环的计数器都会减少。因此,对于第一个机场,我们计算了3744个距离。对于第二个,我们已经计算了3743个距离,因为我们已经在与第一个机场的第一个环路中计算了它的距离。现在,假设第一个机场为 Animas Air Park(K00C),第二个机场为 Broadus Airport(K00F)。记录将在

中显示在tblDistance中
(KOOC, other3744aiports, distance)

第二个机场

(K00C, K00F, distance) //This one record has been already calculated in 1st iteration of the loop
(KOOF, other3743aiports, distance)

因此,除了第一个机场之外,如果我们要查找特定机场的所有距离,可以说K00F,我们需要下面给出的联合查询。

(SELECT * FROM tblDistances WHERE tblDistances.airport1 = 'K00F')
UNION ALL 
(SELECT * FROM tblDistances WHERE  tblDistances.airport2 = 'K00F');

我希望我已经清楚地解释了。现在让我们进入另外两个表。它们分别称为 tblHave tblNeed

tblHave: (departure, departCode, arrival, arrivalCode, flightDate)
tblNeed: (departure, departCode, arrival, arrivalCode, flightDate)

出发地是航班将要起飞的机场的名称,出发地代码(K00C,K00F)是机场的代码,到达和到达代码也一样。

假设我们要从(起飞)旧金山国际机场(KSFO)飞往(到达)南本德Rgnl(KSBN)。现在是真正的问题,我们必须在 tblHave 中找到所有

航班
  1. 与指定航班的日期相同,并且
  2. 出发机场为(KSFO)或在旧金山国际机场(KSFO)的500英里范围内,使用上面说明的联合(称为qryDepart)和
  3. 到达机场是(KSBN)或在 South Bend Rgnl(KSBN)的500英里范围内,并使用上面说明的工会(称为qryArrival)

qryArrival示例

SELECT tblDistances.airport2 as nearBy
FROM tblDistances
WHERE  tblDistances.airport1 = 'KSFO' AND (((Abs([tblDistances].[distance]))<=500)) 
UNION ALL SELECT tblDistances.airport1 as nearBy
FROM tblDistances
WHERE  tblDistances.airport2 = 'KSFO' AND (((Abs([tblDistances].[distance]))<=500));

我不知道如何找到它,而且所有机场的距离组合的总数超过700万。记录在Access数据库中。我发现我从tblDistances找到附近的出发机场和附近的到达机场,然后使用IN子句查找最终结果

Select * from tblHave where arrivalCode IN (qryArrival) AND departCode IN (qryDepart) AND Date = #dd/mm/yyyy#;

这是行不通的,并且由于记录数非常大,合并花费了太多时间。

1 个答案:

答案 0 :(得分:0)

您无需在此处使用UNION。您可以在一个查询中执行此操作,这将使执行时间至少缩短一半,因为您无需两次检查每条记录。您可以使用嵌套的iif语句来确定要用于nearBy的字段,然后更改WHERE以检查记录的两个字段。像这样:

SELECT 
    iif(
        tblDistances.airport = 'KSFO',
        tblDistances.airport2,
            iif(tblDistances.airport2 = 'KSFO',
                tblDistances.airport1,
                null)
        ) as nearBy
FROM tblDistances
WHERE  
    (
        tblDistances.airport1 = 'KSFO'
        OR tblDistances.airport2 = 'KSFO'
    )
    AND (((Abs([tblDistances].[distance]))<=500)) 

如果您使用CASE语句,则更容易阅读,但是Access不支持CASE。上面的查询具有以下作用:

SELECT 
    CASE 
        WHEN tblDistances.airport1 = 'KSFO' then tblDistances.airport2 
        WHEN tblDistances.airport2 = 'KSFO' then tblDistances.airport1
    END as nearBy
FROM tblDistances
WHERE  
    (
        tblDistances.airport1 = 'KSFO'
        OR tblDistances.airport2 = 'KSFO'
    )
    AND (((Abs([tblDistances].[distance]))<=500))