跨多个规范化表的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(*)

另见:


你真的应该停止使用28年前被取代的语法,开始使用ANSI-92 sytle连接:示例数据和期望的结果将真正阐明你想要做什么。乍一看,感觉像是两个交叉应用程序应该做这个把戏,你是受欢迎的。另外,由于您是StackOverflow的新手,我想通知您,您可以通过勾选答案旁边的勾号来选择好答案并接受对您帮助最大的答案。在本网站上,向上投票或接受回答将被视为“谢谢”。计数已记录在DataValues.Value中的单个记录中。因此,这是不必要的。Msg 195,级别15,状态10,第4行“First”不是可识别的内置函数名。这种类型的错误是我使用语法的原因。此错误来自SQL Server Management Studio 2016。但是,我必须有一个语法,该语法在2005年的所有SQL Server版本、8年的Oracle版本和Access 2002中都可以识别,并使用所有版本的兼容驱动程序通过ODBC和OLE-DB执行。使用最少的保留字是阻力最小的途径。非常感谢!我认为有足够的资源来为我的目的重新设置工具。好的
首先
是Access的一个函数。改用
MAX
。注意:应该只有一个值,否则您还必须将子查询放在GROUPBY中。因此,我认为最好使用MAX()聚合函数。我还重构了FROM子句。