【发布时间】:2015-04-02 20:09:01
【问题描述】:
我有四张桌子:
客户
ID | CLIENT_NUM | Year
农场
ID | ClientID | FARM_NUM
字段
ID | FarmID | FIELD_NUM | RANK
土壤表
ID | FarmID | FieldID | SAMP_NUM | Year
我需要从按 Rank、FIELD_NUM 和 Year 排序的 Soilsheet 中获取数据。所以,我尝试了这个:
SELECT FL.Rank,FL.FIELD_NUM, S.Year, SAMP_NUM
FROM (((SoilSheet S
INNER JOIN Farms F ON F.ID = S.FarmID)
INNER JOIN Clients C ON C.ID = F.ClientID)
INNER JOIN Fields FL ON FL.ID = S.FieldID)
WHERE C.CLIENT_NUM = 1 AND F.FARM_NUM = 1
ORDER BY C.CLIENT_NUM, F.FARM_NUM, FL.Rank, FL.FIELD_NUM, S.Year
问题是 RANK 每年都可能不同,因此无法正确排序。我需要按当年的 RANK 排序,例如 2015 年。
通过以上,我得到如下结果:
RANK | FIELD_NUM | Year | SAMP_NUM
0 | 19-2 | 2015 | 3000
2 | 20-1 | 2015 | 3001
2 | 20-1 | 2014 | 2002
2 | 20-1 | 2015 | 1003
20 | 19-2 | 2014 | 2001
19-2 在 2015 年是 RANK 0,但在 2014 年是 20。所以,我尝试了这个:
SELECT FL.Rank,FL.FIELD_NUM, S.Year, SAMP_NUM
FROM ((Clients C
INNER JOIN Farms F ON F.ClientID = C.ID)
INNER JOIN Fields FL ON FL.FarmID = F.ID)
LEFT JOIN (((SoilSheet S
INNER JOIN Fields FLS ON FLS.ID = S.FieldID)
INNER JOIN Farms FS ON FS.ID = S.FarmID)
INNER JOIN Clients CS ON CS.ID = FS.ClientID)
ON
(FLS.FIELD_NUM = FL.FIELD_NUM
AND FS.FARM_NUM = F.FARM_NUM
AND CS.CLIENT_NUM = C.CLIENT_NUM)
WHERE C.CLIENT_NUM = 1 AND F.FARM_NUM = 1 AND C.Year = 2015
ORDER BY C.CLIENT_NUM, F.FARM_NUM, FL.Rank, FL.FIELD_NUM, S.Year
这在 SQL Server 中运行良好:
RANK | FIELD_NUM | Year | SAMP_NUM
0 | 19-2 | 2015 | 3000
0 | 19-2 | 2014 | 2001
2 | 20-1 | 2015 | 3001
2 | 20-1 | 2014 | 2002
2 | 20-1 | 2015 | 1003
在 Access 中,它给出“不支持连接表达式。”。我猜这是因为 Access 不喜欢加入 INNER 连接,但我只是在猜测。
有什么想法吗?另一种订购方式或另一种加入方式?
【问题讨论】:
-
从那篇文章中,“在多表连接中,OUTER JOIN 可以嵌套在 INNER JOIN 中,但 INNER JOIN 不能嵌套在 OUTER JOIN 中。”建议我在 LEFT JOIN 中不能有任何内部连接,所以现在怎么办?
-
我建议您逐表连接以找出问题何时开始。 MS Access 数据库引擎喜欢括号。乍一看,您的查询中括号的数量太少了。
标签: sql-server ms-access