【问题标题】:Join two queries in Access在 Access 中加入两个查询
【发布时间】: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


【解决方案1】:

终于搞定了

SELECT C1.Year,C1.RANK, C1.FIELD_NUM, C.CLIENT_NUM, F.FARM_NUM FROM
(SELECT C.Year,FL.RANK, FL.FIELD_NUM, C.CLIENT_NUM, F.FARM_NUM FROM 
((Clients C 
INNER JOIN Farms F ON F.ClientID = C.ID) 
INNER JOIN Fields FL ON FL.FarmID = F.ID)) C1
LEFT JOIN 
(SELECT S.Year, SAMP_NUM,FLS.FIELD_NUM, FS.FARM_NUM, CS.CLIENT_NUM 
FROM ((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) S1
ON (S1.FIELD_NUM = C1.FIELD_NUM AND S1.FARM_NUM = C1.FARM_NUM 
AND S1.CLIENT_NUM = C1.CLIENT_NUM)
WHERE C.CLIENT_NUM = 1 AND F.FARM_NUM = 1 AND C.Year = 2015  
ORDER BY FL.Rank, FL.FIELD_NUM 

【讨论】:

  • 最后你做了什么改变让它工作?是括号的位置吗?
【解决方案2】:

您是否尝试将 TSQL 从 SQL Server 复制到 Access 中?不幸的是,如果不修改联接,这将无法工作。具体来说,您需要在连接子句周围加上括号。

查看此以获取更多信息:

SQL Inner Joins with multiple tables

【讨论】:

  • 周围有括号。它不喜欢的是 ON (FLS.FIELD_NUM = FL.FIELD_NUM AND FS.FARM_NUM = F.FARM_NUM AND CS.CLIENT_NUM = C.CLIENT_NUM)。
  • 您是否在 SQL 视图中工作?当您使用设计视图构建这些查询时会发生什么? (即你不需要考虑括号)
猜你喜欢
  • 2021-10-13
  • 2016-01-06
  • 2015-10-26
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 2013-05-18
相关资源
最近更新 更多