跨多个规范化表的SQL查询设计
表关系图: 基本查询是:跨多个规范化表的SQL查询设计,sql,sql-server,Sql,Sql Server,表关系图: 基本查询是: SELECT DateTime, SubgroupID, TestID FROM Subgroups WHERE CharID IN (SELECT CharID FROM CharList WHERE ChartType = 2) AND PtLoc > 0 然后,我将循环遍历记录集以获取其他信息: SELECT DefectDescription, Value FROM DefectDescriptions, DataValues WHERE Su
SELECT DateTime, SubgroupID, TestID
FROM Subgroups
WHERE CharID IN (SELECT CharID FROM CharList WHERE ChartType = 2) AND PtLoc > 0
然后,我将循环遍历记录集以获取其他信息:
SELECT DefectDescription, Value
FROM DefectDescriptions, DataValues
WHERE SubgroupID = (SubgroupID from above) AND DefectID = SampleNumber
对于上述各项记录:
SELECT TextValue AS PartNum
FROM ParameterEntries
WHERE
TestID = (TestID from above)
AND ParameterID = (SELECT ParameterID FROM ParameterDefinitions WHERE ParameterName = "PartNum")
SELECT TextValue AS SerialNum
FROM ParameterEntries
WHERE
TestID = (TestID from above)
AND ParameterID = (SELECT ParameterID FROM ParameterDefinitions WHERE ParameterName = "SerialNum")
要构建表,请执行以下操作:
DateTime, PartNum, SerialNum, DefectDescription, Value(number of defects)
这是否可以在单个查询中完成,而不是通过循环每个记录从链接表中获取记录?如果加入表,则可以作为单个查询完成
SELECT
Subgroups.DateTime, DefectDescriptions.DefectDescription, DataValues.Value,
Subgroups.TestID, Count(*) AS NumberOfDefects,
MAX((SELECT MAX(E.TextValue)
FROM ParameterDefinitions AS D
INNER JOIN ParameterEntries AS E ON D.ParameterID = E.ParameterID
WHERE D.ParameterName="PartNum" AND E.TestID=Subgroups.TestID)
) AS PartNum,
MAX((SELECT MAX(E.TextValue)
FROM ParameterDefinitions AS D
INNER JOIN ParameterEntries AS E ON D.ParameterID = E.ParameterID
WHERE D.ParameterName="SerialNum" AND E.TestID=Subgroups.TestID)
) AS SerialNum
FROM
DefectDescriptions
INNER JOIN DataValues
ON DefectDescriptions.DefectID = DataValues.SampleNumber
INNER JOIN Subgroups
ON DataValues.SubgroupID = Subgroups.SubgroupID
INNER JOIN CharList
ON CharList.CharID = Subgroups.CharID
WHERE
CharList.CharType=2 AND Subgroups.PtLoc>0
GROUP BY
Subgroups.DateTime, DefectDescriptions.DefectDescription,
DataValues.Value, Subgroups.TestID;
如果将其作为SQL(在SQL视图中)复制/粘贴到查询设计器中,您将看到在切换回设计视图时如何连接表。这两个参数是通过子查询选择的
您还必须使用GROUP BY子句,以便能够使用count(*)
另见:
首先是Access的一个函数。改用MAX
。注意:应该只有一个值,否则您还必须将子查询放在GROUPBY中。因此,我认为最好使用MAX()聚合函数。我还重构了FROM子句。