SQL Server对多个表的嵌套查询
我有一个包含GridData、FormList和FormData表的数据库 我需要从FormData表中提取一个名为Value的字段,但无法确定如何构造查询。我可以一个接一个地运行它,它会给出结果,但需要将它一起包含在表输出中 当我逐步运行查询时,查询是: 从GridData中选择*,其中GridName='uwg'-返回: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
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子句中使用,则不要与=,<进行比较,因为该操作需要单个值。而是在操作符中使用。这有很大帮助,但缺少一个深度。