在Access DB的SQL查询中返回包含3个不同字段的多列
我试图创建一个返回多个字段的查询,将前3个字段保留为不同的列,并返回上次修改日期的值。查询字段中的一些变量应该来自多个表,其中一个也有一个True/False条件。需要三个不同的字段,因为它们的组合与其他返回参数相关联 这些表格大致如下所示 表a:在Access DB的SQL查询中返回包含3个不同字段的多列,sql,select,distinct,Sql,Select,Distinct,我试图创建一个返回多个字段的查询,将前3个字段保留为不同的列,并返回上次修改日期的值。查询字段中的一些变量应该来自多个表,其中一个也有一个True/False条件。需要三个不同的字段,因为它们的组合与其他返回参数相关联 这些表格大致如下所示 表a: ID | Sc | Country | TechID | VarA | ... | VarX(T/F) | LastModified 1 | 1 | AA | 1 | x | ... | T | 1-
ID | Sc | Country | TechID | VarA | ... | VarX(T/F) | LastModified
1 | 1 | AA | 1 | x | ... | T | 1-1-2017
2 | 1 | AA | 1 | z | ... | T | 1-1-2017
3 | 1 | AA | 2 | y | ... | T | 1-1-2018
4 | 1 | AB | 1 | u | ... | T | 1-1-2017
5 | 2 | AB | 2 | v | ... | T | 1-1-2018
6 | 3 | AB | 1 | w | ... | F | 1-1-2018
表b:
TechID | TechName | Categ | Units
1 | Tech1 | Cat1 | M
2 | Tech2 | Cat2 | N
3 | Tech3 | Cat3 | P
其思想是查询返回类似这样的结果(当满足T/F标准时)。Sc国家/地区技术组合仅出现一次,最后一次修改的技术组合存在:
Sc' | Country' |TechName'| Units | Cat | VarA... | LastModified |
1 | AA | 1 | ... | ... | ... | 1-1-2018
1 | AB | 2 | ... | ... | ... | 1-1-2017
2 | AB | 1 | ... | ... | ... | 1-1-2018
到目前为止,我已经尝试了几行SQL语句,但都没有用。首先,使用Select DISTINCT,但该选项太“全面”
也尝试了此操作,但它会提示与聚合函数相关的错误:
SELECT a.Sc, a.Country, b.TechID, b.Units, b.Cat, a.VarA,..,a.VarX, Max(a.LastModified) AS MaxOfLastModified
FROM a INNER JOIN (b INNER JOIN a ON b.TechName =
a.TechID) ON b.Cat = a.TechID
GROUP BY a.Sc, a.Country, a.TechID
HAVING (((a.VarX)=True));
关于如何进行这项工作,有什么想法/建议吗??任何指向先前相关答案的提示也将不胜感激
提前感谢!:)
编辑(2017.09.29):
这确实让事情变得明朗了一点 仅当从具有以下内容的单个表中调用字段时,我才设法使用某些字段执行查询:
SELECT a.Sc, a.Country, a.Tech, a.LastModified, a.VarA
FROM a INNER JOIN (SELECT Sc, Country, Tech, max(LastModified) AS lm FROM a GROUP BY Sc, Country, Tech) AS dt ON (dt.lm=a.LastModified) AND (dt.Tech=a.Tech) AND (dt.Country=a.Country) AND (dt.Sc=a.Sc)
GROUP BY a.Sc, a.Country, a.Tech, a.LastModified, a.VarA, a.VarX
HAVING (((a.VarX)=Yes));
在尝试使用建议的内部JOIN命令从查找表添加字段时,我仍然在JOIN上遇到语法错误。我尝试的代码类似于:
SELECT a.Sc, a.Country, a.Tech, a.LastModified, a.VarA b.TechCategory
FROM a INNER JOIN (SELECT Sc, Country, Tech, max(LastModified) AS lm FROM a GROUP BY Sc, Country, Tech) AS dt ON (dt.lm=a.LastModified) AND (dt.Tech=a.Tech) AND (dt.Country=a.Country) AND (dt.Sc=a.Sc)
INNER JOIN b ON Tech.Category=a.Tech
GROUP BY a.Sc, a.Country, a.Tech, b.TechCategory, a.LastModified, a.VarA, a.VarX
HAVING (((a.VarX)=Yes));
任何额外的指示都非常感谢 使用聚合查询获取
Sc
、Country
和TechID
的每个组合的最长日期,然后将其用作子查询,并将其连接回表a
和b
,以获取最终查询中的数据。大概是这样的:
select
a.Sc, a.Country, b.TechName,
b.Units, b.Category, b.Units, a.VarA, a.LastModified
from
(Table_a as a
inner join (
select Sc, Country, TechID, max(LastModified) as lm
from Table_a
group by Sc, Country, TechID
) as dt on dt.Sc=a.Sc and dt.Country=a.Country and dt.TechID=a.TechID and dt.lm=a.LastModified)
inner join Table_b as b on b.TechID=a.TechID
这确实让事情变得明朗了一点。我设法使查询与单个表中的字段一起运行。在尝试使用建议的第二个内部JOIN命令从查找表中添加字段时,查询在JOIN上仍遇到语法错误。我正在扩展新代码,作为对我原始问题的编辑。在您的编辑中,表
b
的连接没有引用表b
,但它引用了Tech.Category
,并且Tech
不是定义的表或别名,而Category
不是示例表a
和b
的一列。在同一联接中,示例表中不存在列a.Tech
。您的示例不准确,或者代码有印刷或逻辑错误。
select
a.Sc, a.Country, b.TechName,
b.Units, b.Category, b.Units, a.VarA, a.LastModified
from
(Table_a as a
inner join (
select Sc, Country, TechID, max(LastModified) as lm
from Table_a
group by Sc, Country, TechID
) as dt on dt.Sc=a.Sc and dt.Country=a.Country and dt.TechID=a.TechID and dt.lm=a.LastModified)
inner join Table_b as b on b.TechID=a.TechID