首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大型记录集的复杂SQL查询

大型记录集的复杂SQL查询
EN

Stack Overflow用户
提问于 2018-09-28 21:34:01
回答 1查看 78关注 0票数 1

我有三张桌子。让我们从解释第一个问题开始

代码语言:javascript
复制
tblDistance: (airport1, airport2, distance) // airport1 and airport 2 are airport codes

这个表包含了美国所有机场之间的距离(以英里为单位),总共有3745个机场,距离是用嵌套的for循环计算的,每个循环的计数器都是递减的。因此,对于第一个机场,我们计算了3744个距离。对于第二个,我们计算了3743个距离,因为我们已经在第一个循环中计算了它与第一个机场的距离。现在假设第一个机场是动物公园(K00C),第二个机场是Broadus (K00F)。这些记录将在tblDistance中显示为

代码语言:javascript
复制
(KOOC, other3744aiports, distance)

去第二个机场

代码语言:javascript
复制
(K00C, K00F, distance) //This one record has been already calculated in 1st iteration of the loop
(KOOF, other3743aiports, distance)

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

代码语言:javascript
复制
(SELECT * FROM tblDistances WHERE tblDistances.airport1 = 'K00F')
UNION ALL 
(SELECT * FROM tblDistances WHERE  tblDistances.airport2 = 'K00F');

我希望我已经解释清楚了。现在让我们来看看另外两张桌子。他们被称为tblHavetblNeed

代码语言:javascript
复制
tblHave: (departure, departCode, arrival, arrivalCode, flightDate)
tblNeed: (departure, departCode, arrival, arrivalCode, flightDate)

起飞是该航班将离开的机场的名称,而departCode(K00C,K00F)是机场的代码,同样适用于到达和arrivalCode。

假设我们有从(出发) San Francisco Intl (KSFO)到(抵达) South Bend (KSBN)在tblNeed的航班。现在真正的问题是我们必须在tblHave找到所有的航班

  1. 在同一天给出的航班
  2. 出发机场是(KSFO),或距离三藩市国际机场( San Francisco Intl,KSFO) 500英里,使用的是上面所述的联合(让我们称之为qryDepart)和
  3. 到达机场是(KSBN)或South Bend (KSBN) 500英里内,使用上面解释的联合(让我们称之为qryArrival)。

样本qryArrival

代码语言:javascript
复制
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));

我不知道如何才能找到这个,而且所有机场的总no.of距离都超过了700万。记录在Access数据库中。我所得到的数字是,我从tblDistances找到了附近的起飞机场和附近的到达机场,然后使用这个子句来查找最终结果。

代码语言:javascript
复制
Select * from tblHave where arrivalCode IN (qryArrival) AND departCode IN (qryDepart) AND Date = #dd/mm/yyyy#;

这是行不通的,工会花费了太多的时间,因为记录的数字非常大。

EN

回答 1

Stack Overflow用户

发布于 2018-09-28 22:00:51

这里不需要使用UNION。您可以在一个查询中这样做,这至少可以将您的执行时间减少一半,因为您不会检查每条记录两次。可以使用嵌套的iif语句来确定用于nearBy的字段,然后更改WHERE以检查记录的两个字段。如下所示:

代码语言:javascript
复制
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。上述查询所做的工作与以下相同:

代码语言:javascript
复制
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)) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52562887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档