我有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 中找到所有
航班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#;
这是行不通的,并且由于记录数非常大,合并花费了太多时间。
答案 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))