2017-05-16 256 views
2

我有表的GridDataFORMLISTFORMDATA的数据库。SQL Server的嵌套查询

我需要从FORMDATA表拉了一个名为场,但无法弄清楚如何构建查询。我可以一个接一个地运行它,它给了我结果,但需要将它包含在表输出中。

查询,当我运行它一步一步的是:

选择*的GridData其中GridName = '反不正当竞争法' - 回报:

FormId  GridName  Example Field 
1244135  uwg    9 
1244135  uwg    10 
1244135  uwg    11 
1244135  uwg    7 
1244135  uwg    66 

使用FormID field,I lookup the FormList

Sele从FORMLIST CT *其中FormID = 1244135个 - 回报:

JobId  FormName  FormId 
1241899  ExampleForm  1244135 

然后查询SAME FORMLIST表,其中FormID =从上面的JobID ..

选择从* FORMLIST其中FormID = 1241899 - 回报:

JobId  FormName  FormId 
1241894  ExampleForm2 1241899 

AGAIN ..查询SAME FORMLIST表,其中FormID =作业ID从上方..

SELECT * FROM FORMLIST其中FormID = 1241894个 - 回报:

JobId  FormName  FormId 
1241893  ExampleForm3 1241894 

的作业ID从此结果是我需要在FormData表中引用的ID以返回我需要的值...

选择价值FORMDATA其中FormID = 1241893和Name = '产品名称' - 回报:

Value 
12345 

我在这里的目标是要能够从的GridData表中返回所有的值,与“数值”字段中的相应条目FormData

我真的很苦恼如何编写这个查询!

我试过以下,但它返回多个重复的条目。该价值字段包含多种数据类型,我只值从这个表感兴趣,其中FormData.Name = '产品名称'

SELECT \t Value, 
 
     RecordId, 
 
\t GridData.FormId, 
 
\t GridName, 
 
\t ExampleField 
 
     
 
    FROM \t GridData 
 

 
    JOIN \t FormData 
 

 
    ON \t GridData.FormId = FormData.FormID 
 
    
 
    WHERE GridData.FormId IN 
 

 
    (SELECT FormList.FormId FROM FormList WHERE FormList.FormId IN 
 
    (SELECT FormList.FormId FROM FormList WHERE FormList.FormId IN 
 
    (SELECT FormList.FormId FROM FormList WHERE FormList.FormId IN 
 
    (SELECT FormData.FormID FROM FormData)))) 
 

 
    AND FormData.DataItemName = 'JobProductName'

+0

根据你的描述,FormList的子SELECT应该选择'JobID',而不是'FormId'。另外,将AND AND子句放在带有FormData-SELECT的括号中) – TToni

+0

听起来像你想要使用递归查询。我也不明白为什么你在查询中没有包含FormData.Name ='ProductName',除非你没有将你的解释与你的描述同步。 –

+1

是任意深度还是深度三的递归? –

回答

1
SELECT Value, RecordId,GridData.FormId,GridName,ExampleField 
FROM GridData 
Join FormList On GridData.FormID = FormList.FormID 
Join FormList A On FormList.JobID = A.FormID 
JOIN FormData On A.JobID = FormData.FormID 
Where FormData.DataItemName = 'JobProductName'; 
+0

这个工作,但是我得到一个错误后大约50,000行与**“子查询返回超过1个值。这是不允许的,当子查询遵循=,!=,<, <= , >,> =或当子查询被用作表达式“”“ 值得一提的是我以3列为例,大约有80列。 – boseytal

+0

同样值得注意的预期行回报为2,980,000 – boseytal

+1

您是在Select中使用子查询还是在上述查询的caluse处使用子查询?在select子句中使用它应该只返回1条记录,为了确保使用Top 1,但是这可以租用到不合适的结果。如果用在where子句中,不要与=,<期望的操作比较,而是使用In运算符。 –

0
SELECT  GD.* 
       ,FD.value 
    FROM  GridData GD 
LEFT JOIN  FormList FL 
      ON GD.FormID = FL.FormID 
LEFT JOIN FormList FL1 
      ON FL.JobID = FL1.FormID 
LEFT JOIN FormData FD 
      ON FL1,JobID = FD.FormID 
    WHERE GD.GridName = 'uwg' 
     AND FormData.DataItemName = 'JobProductName' 
+0

谢谢 - 但这只返回一个字段。 – boseytal

+0

Oups,mea culpa。我更正了你想要的列 – luisarcher

+0

我跑这个,它确实返回行,它也返回重复作为FormData.DataItemName ='JobProductName'不在那里的过滤器。 如上所述,如果我运行没有过滤器的查询,它只会返回预期的2.9米50,000 - 但与上述,我收到一个错误,我没有在这里.. – boseytal

0

您可以尝试运行下面的查询,一级一级?

等级之一为的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' 
      ) 
     ) 
    ) 
) 
0

,我设法与提取数据的查询是:

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' 

在得到这样的结论如下帮助的帖子 - 谢谢大家。