【发布时间】:2015-05-15 10:32:53
【问题描述】:
我有一个名为 tblRoutes 的表,其中包含一个唯一的 from 和 to 路线列表(f = from;t = to):
| fCity | fState | tCity | tState |
|========|========|========|========|
|New York| NY | Miami | CA |
|Houston | TX |New York| NY |
...
然后我有一个名为 tblCarrierRates 的表格,其中列出了运营商为旅行某些路线提供的一系列等级和费率:
| fCity | fState | tCity | tState | Tier | Rate | CarrID | CarrName |
|========|========|========|========|======|======|========|=============|
|New York| NY | Miami | CA | 2 | $2.99| ABCD | Abracadabra |
|New York| NY | Miami | CA | 1 | $3.00| BUMP | Bumpy Rides |
|Houston | TX |New York| NY | 2 | $4.00| SLOW |Slow Carriers|
|Houston | TX |New York| NY | 2 | $4.01| ABCD | Abracadabra |
...
对于 tblRoutes 中列出的每条独特路线,我正在寻找 tblCarrierRates 提供的 1 条“最佳”路线。
“最佳”的标准是最低Tier,其次是最低Rate。
结果需要返回 tblCarrierRates 中显示的所有字段,因此基于上面 tblRoutes 中显示的 2 条路线,期望的结果是:
| fCity | fState | tCity | tState | Tier | Rate | CarrID | CarrName |
|========|========|========|========|======|======|========|=============|
|New York| NY | Miami | CA | 1 | $3.00| BUMP | Bumpy Rides |
|Houston | TX |New York| NY | 2 | $4.00| SLOW |Slow Carriers|
我正在研究的方法是按升序排序Tier,然后Rate,然后是如何匹配 fCity、fState 的每个唯一组合的 TOP 1 记录、tCity 和 tState:
SELECT A.fCity, A.fState, A.tCity, A.tState, Q.Tier, Q.Rate, Q.CarrID, Q.CarrName
FROM tblRoutes As A LEFT JOIN
(SELECT TOP 1 B.CarrID, B.CarrName, B.fCity, B.fState, B.tCity, B.tState, B.Rate, B.Tier
FROM tblCarrierRates As B
ORDER BY tblCarrierRates.Tier ASC, tblCarrierRates.Rate ASC) As Q
ON (A.tState = Q.tState) AND (A.tCity = Q.tCity) AND (A.fState = Q.fState) AND (A.fCity = Q.fCity);
查询没有失败,但是你可能猜到了,我写的子查询 (Q) 只为 tblRoutes 中的每个路由返回一条记录而不是 1,所以结束结果是:
| fCity | fState | tCity | tState | Tier | Rate | CarrID | CarrName |
|========|========|========|========|======|======|========|=============|
|New York| NY | Miami | CA | 1 | $3.00| BUMP | Bumpy Rides |
|Houston | TX |New York| NY | | | | |
...如您所见,休斯顿到纽约没有任何匹配项,因为我的子查询仅返回 1 个结果,而不是每条路线的 1 个。
我怎样才能达到我想要的结果?
【问题讨论】:
标签: sql ms-access ms-access-2010 ms-access-2013