我有三张桌子。让我们从解释第一个问题开始
tblDistance: (airport1, airport2, distance) // airport1 and airport 2 are airport codes这个表包含了美国所有机场之间的距离(以英里为单位),总共有3745个机场,距离是用嵌套的for循环计算的,每个循环的计数器都是递减的。因此,对于第一个机场,我们计算了3744个距离。对于第二个,我们计算了3743个距离,因为我们已经在第一个循环中计算了它与第一个机场的距离。现在假设第一个机场是动物公园(K00C),第二个机场是Broadus (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)起飞是该航班将离开的机场的名称,而departCode(K00C,K00F)是机场的代码,同样适用于到达和arrivalCode。
假设我们有从(出发) San Francisco Intl (KSFO)到(抵达) South Bend (KSBN)在tblNeed的航班。现在真正的问题是我们必须在tblHave找到所有的航班
样本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));我不知道如何才能找到这个,而且所有机场的总no.of距离都超过了700万。记录在Access数据库中。我所得到的数字是,我从tblDistances找到了附近的起飞机场和附近的到达机场,然后使用这个子句来查找最终结果。
Select * from tblHave where arrivalCode IN (qryArrival) AND departCode IN (qryDepart) AND Date = #dd/mm/yyyy#;这是行不通的,工会花费了太多的时间,因为记录的数字非常大。
发布于 2018-09-28 22:00:51
这里不需要使用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)) https://stackoverflow.com/questions/52562887
复制相似问题