SQL Server对多个表的嵌套查询

SQL Server对多个表的嵌套查询,sql,tsql,select,nested,subquery,Sql,Tsql,Select,Nested,Subquery,我有一个包含GridData、FormList和FormData表的数据库 我需要从FormData表中提取一个名为Value的字段,但无法确定如何构造查询。我可以一个接一个地运行它,它会给出结果,但需要将它一起包含在表输出中 当我逐步运行查询时,查询是: 从GridData中选择*,其中GridName='uwg'-返回: FormId GridName Example Field 1244135 uwg 9 1244135 uw

我有一个包含GridData、FormList和FormData表的数据库

我需要从FormData表中提取一个名为Value的字段,但无法确定如何构造查询。我可以一个接一个地运行它,它会给出结果,但需要将它一起包含在表输出中

当我逐步运行查询时,查询是:

从GridData中选择*,其中GridName='uwg'-返回:

FormId      GridName        Example Field
1244135     uwg             9
1244135     uwg             10
1244135     uwg             11
1244135     uwg             7
1244135     uwg             66
JobId       FormName        FormId
1241899     ExampleForm     1244135
JobId       FormName        FormId
1241894     ExampleForm2    1241899
JobId       FormName        FormId
1241893     ExampleForm3    1241894
Value
12345
使用该FormID字段,我查找FormList表

从FormList中选择*,其中FormID=1244135-返回:

FormId      GridName        Example Field
1244135     uwg             9
1244135     uwg             10
1244135     uwg             11
1244135     uwg             7
1244135     uwg             66
JobId       FormName        FormId
1241899     ExampleForm     1244135
JobId       FormName        FormId
1241894     ExampleForm2    1241899
JobId       FormName        FormId
1241893     ExampleForm3    1241894
Value
12345
然后从上面查询FormID=JobID的同一FormList表

从FormList中选择*,其中FormID=1241899-返回:

FormId      GridName        Example Field
1244135     uwg             9
1244135     uwg             10
1244135     uwg             11
1244135     uwg             7
1244135     uwg             66
JobId       FormName        FormId
1241899     ExampleForm     1244135
JobId       FormName        FormId
1241894     ExampleForm2    1241899
JobId       FormName        FormId
1241893     ExampleForm3    1241894
Value
12345
再一次。。从上面查询FormID=JobID的同一FormList表

从FormList中选择*,其中FormID=1241894-返回:

FormId      GridName        Example Field
1244135     uwg             9
1244135     uwg             10
1244135     uwg             11
1244135     uwg             7
1244135     uwg             66
JobId       FormName        FormId
1241899     ExampleForm     1244135
JobId       FormName        FormId
1241894     ExampleForm2    1241899
JobId       FormName        FormId
1241893     ExampleForm3    1241894
Value
12345
此结果中的JobID是我需要在FormData表中引用的ID,以返回我需要的值

从FormData中选择值,其中FormID=1241893,Name='ProductName'-返回:

FormId      GridName        Example Field
1244135     uwg             9
1244135     uwg             10
1244135     uwg             11
1244135     uwg             7
1244135     uwg             66
JobId       FormName        FormId
1241899     ExampleForm     1244135
JobId       FormName        FormId
1241894     ExampleForm2    1241899
JobId       FormName        FormId
1241893     ExampleForm3    1241894
Value
12345
我的目标是能够返回GridData表中的所有值,并在FormData值字段中输入相应的条目

我真的很纠结于如何写这个查询

我尝试了以下操作,但它返回多个重复条目。Value字段包含多种数据类型,我只对FormData.Name='ProductName'所在表中的值感兴趣

选择值, RecordId, GridData.FormId, GridName, 示例字段 从网格数据 联接FormData 在GridData.FormId=FormData.FormId上 GridData.FormId在哪里 从FormList中选择FormList.FormId,其中FormList.FormId位于 从FormList中选择FormList.FormId,其中FormList.FormId位于 从FormList中选择FormList.FormId,其中FormList.FormId位于 从FormData中选择FormData.FormID
和FormData.DataItemName='JobProductName'能否请您尝试逐级运行下面的查询

第一级是GridData单独的第14-16行,下一级是11-17行,然后重复到顶部。这样,如果事情出了问题,你可以检查他们什么时候做。要么这样,要么你就无问题地到达了顶端:

也许可以重写得更好,但至少现在让我们有一个工作版本

SELECT [Value] -- 12345
FROM FormData
WHERE [Name] = 'ProductName'
  AND FormID IN (
    SELECT JobId -- 1241893
    FROM FormList
    WHERE FormID IN (
        SELECT JobId -- 1241894
        FROM FormList
        WHERE FormID IN (
            SELECT JobId -- 1241899
            FROM FormList
            WHERE FormID IN (
                SELECT FormId -- 1244135
                FROM GridData
                WHERE GridName = 'uwg'
            )
        )
    )
)

我用来提取数据的查询是:

Select  FD.Value, G.*
FROM    GridData G

JOIN FormList FL1 ON FL1.FormID = G.FormID
JOIN FormList FL2 ON FL1.JobID = FL2.FormID
JOIN FormList FL3 ON FL2.JobId = FL3.FormID
JOIN FormData FD ON FL3.JobId = FD.FormID

WHERE FD.DataItemName = 'ProductNameHere' and G.GridName = 'GridNameHere'

下面的帖子有助于得出这个结论——谢谢大家

根据您的描述,FormList的子选项应选择JobID,而不是FormId。另外,将AND子句和FormData SELECT放在括号中听起来像是要使用递归查询。我也不明白你为什么不在查询中包含FormData.Name='ProductName',除非你只是不将解释与描述同步。是任意深度的递归还是仅深度3?@TToni疏忽了带有JobID字段的OP。@AnthonyHancock我正在尝试筛选返回的值其中的名称是“JobProductName”-我可能没有正确使用它。当我在没有它的情况下运行时,返回了多个重复的记录。谢谢-但这只返回一个字段。Oups,我错了。我已更正了您需要的列。我运行了此操作,它确实返回了行,但也返回了重复项,因为FormData.DataItemName='JobProductName'上的筛选器不存在。如上所述,如果我在没有过滤器的情况下运行查询,它只返回50000个预期的2.9m-但是在上面,我收到了一个错误,我没有在这里..我将过滤器添加到了我的答案中。您应该在数据库的一小部分上尝试该查询,这样您就可以知道要返回哪些行,并检查它是否有效。这是有效的,但是在**子查询返回超过1个值的50000行之后,我遇到了一个错误。当子查询在=、!=、=或者当子查询用作表达式时。值得一提的是,我以3列为例,大约有80列。还值得一提的是,预期的行返回为2980000。您是在Select中使用子查询,还是在where caluse中使用上述查询?在select子句中使用子查询时,它应该只返回1条记录。确保使用Top 1,但这可能导致意外结果。如果在where子句中使用,则不要与=,<进行比较,因为该操作需要单个值。而是在操作符中使用。这有很大帮助,但缺少一个深度。