Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL,使用主查询的结果生成子查询_Sql_Sql Server_Tsql - Fatal编程技术网

SQL,使用主查询的结果生成子查询

SQL,使用主查询的结果生成子查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图在视图中添加一列。此列使用以前的结果计算新值 但是,似乎不可能将主查询的结果用于子查询 为了简化问题,它将给出: SELECT DISTINCT Operation, Invoice, Corrective, TestNumber = ( SELECT DISTINCT Operation, Invoice FROM Tab1 WHERE Operation = Tab1.Corrective)

我试图在视图中添加一列。此列使用以前的结果计算新值

但是,似乎不可能将主查询的结果用于子查询

为了简化问题,它将给出:

   SELECT DISTINCT Operation, Invoice, Corrective, 
   TestNumber = ( SELECT DISTINCT Operation, Invoice 
                   FROM Tab1
                   WHERE Operation = Tab1.Corrective)
   FROM Tab1
但是,它不起作用

如果我写了以下内容,它会起作用:

    SELECT DISTINCT Operation, Invoice, Corrective, 
    TestNumber = ( SELECT DISTINCT Operation, Invoice 
                   FROM Tab1
                   WHERE Operation = 20483)
    FROM Tab1

SQL似乎试图提取条件操作=纠正的所有数字。然而,我真正想要的是获取上一个选项卡更正结果,并将其注入到我的子查询中。我该怎么办

这是真正的代码:

SELECT DISTINCT dbo.Operation.Id AS OperationID, 
                dbo.Invoice.Id AS maxInvoice, 
                dbo.Operation.CorectiveId as Corective,  
                (
                    SELECT Distinct dbo.Invoice.InvoiceNumber
                    FROM dbo.Invoice INNER JOIN
                    dbo.InvoiceClient ON dbo.Invoice.Id = dbo.InvoiceClient.InvoiceId 
                    INNER JOIN dbo.InvoiceLine ON dbo.Invoice.Id =  dbo.InvoiceLine.InvoiceId 
                    INNER JOIN dbo.Operation ON dbo.Invoice.OperationId = dbo.Operation.Id
                    INNER JOIN (
                        SELECT dbo.Operation.Id as OperationID, MAX(DISTINCT dbo.Invoice.Id) as MaxInvoice
                        FROM dbo.Invoice 
                        INNER JOIN dbo.InvoiceClient ON dbo.Invoice.Id = dbo.InvoiceClient.InvoiceId 
                        INNER JOIN dbo.InvoiceLine ON dbo.Invoice.Id = dbo.InvoiceLine.InvoiceId 
                        INNER JOIN dbo.Operation ON dbo.Invoice.OperationId = dbo.Operation.Id
                    GROUP BY dbo.Operation.Id) sub1 ON dbo.Invoice.Id = sub1.MaxInvoice 
                                                   AND dbo.Operation.Id = sub1.OperationID

                    WHERE dbo.Operation.Id = dbo.Operation.CorectiveId
                ) as testnumber 
FROM (dbo.Invoice 
INNER JOIN dbo.InvoiceClient ON dbo.Invoice.Id = dbo.InvoiceClient.InvoiceId 
INNER JOIN dbo.InvoiceLine ON dbo.Invoice.Id = dbo.InvoiceLine.InvoiceId 
INNER JOIN dbo.InvoiceLineHistory ON dbo.InvoiceLine.Id = dbo.InvoiceLineHistory.InvoiceLineId 
INNER JOIN dbo.Operation ON dbo.Invoice.OperationId = dbo.Operation.Id
INNER JOIN (
    SELECT dbo.Operation.Id as OperationID, MAX(DISTINCT dbo.Invoice.Id) as MaxInvoice
    FROM dbo.Invoice 
    INNER JOIN dbo.InvoiceClient ON dbo.Invoice.Id = dbo.InvoiceClient.InvoiceId 
    INNER JOIN dbo.InvoiceLine ON dbo.Invoice.Id = dbo.InvoiceLine.InvoiceId 
    INNER JOIN dbo.Operation ON dbo.Invoice.OperationId = dbo.Operation.Id
    GROUP BY dbo.Operation.Id) sub ON dbo.Invoice.Id = sub.MaxInvoice 
                                  AND dbo.Operation.Id = sub.OperationID 
)
ORDER BY dbo.Operation.Id 

请尝试以下代码:

  SELECT DISTINCT dbo.Operation.Id AS OperationID,
              dbo.Invoice.Id AS maxInvoice,
              dbo.Operation.CorectiveId AS Corective,
              (SELECT DISTINCT dbo.Invoice.InvoiceNumber
                 FROM dbo.Invoice
                      INNER JOIN dbo.InvoiceClient ON dbo.Invoice.Id = dbo.InvoiceClient.InvoiceId
                      INNER JOIN dbo.InvoiceLine ON dbo.Invoice.Id = dbo.InvoiceLine.InvoiceId
                      INNER JOIN dbo.Operation operation_inner ON dbo.Invoice.OperationId = operation_inner.Id
                      INNER JOIN (  SELECT dbo.Operation.Id AS OperationID, MAX (DISTINCT dbo.Invoice.Id) AS MaxInvoice
                                      FROM dbo.Invoice
                                           INNER JOIN dbo.InvoiceClient ON dbo.Invoice.Id = dbo.InvoiceClient.InvoiceId
                                           INNER JOIN dbo.InvoiceLine ON dbo.Invoice.Id = dbo.InvoiceLine.InvoiceId
                                           INNER JOIN dbo.Operation ON dbo.Invoice.OperationId = dbo.Operation.Id
                                  GROUP BY dbo.Operation.Id) sub1
                          ON dbo.Invoice.Id = sub1.MaxInvoice AND dbo.Operation.Id = sub1.OperationID
                WHERE dbo.Operation.Id = operation_inner.CorectiveId)
                  AS testnumber
FROM (dbo.Invoice
      INNER JOIN dbo.InvoiceClient ON dbo.Invoice.Id = dbo.InvoiceClient.InvoiceId
      INNER JOIN dbo.InvoiceLine ON dbo.Invoice.Id = dbo.InvoiceLine.InvoiceId
      INNER JOIN dbo.InvoiceLineHistory ON dbo.InvoiceLine.Id = dbo.InvoiceLineHistory.InvoiceLineId
      INNER JOIN dbo.Operation operation_outer ON dbo.Invoice.OperationId = operation_outer.Id
      INNER JOIN (  SELECT dbo.Operation.Id AS OperationID, MAX (DISTINCT dbo.Invoice.Id) AS MaxInvoice
                      FROM dbo.Invoice
                           INNER JOIN dbo.InvoiceClient ON dbo.Invoice.Id = dbo.InvoiceClient.InvoiceId
                           INNER JOIN dbo.InvoiceLine ON dbo.Invoice.Id = dbo.InvoiceLine.InvoiceId
                           INNER JOIN dbo.Operation ON dbo.Invoice.OperationId = dbo.Operation.Id
                  GROUP BY dbo.Operation.Id) sub
          ON dbo.Invoice.Id = sub.MaxInvoice AND operation_outer.Id = sub.OperationID)
ORDER BY operation_outer.Id
问题在于区分dbo.Operation表到底是哪一列连接的

例如,当您编写WHERE dbo.Operation.Id=dbo.Operation.corecoctiveId时,它是来自同一个表的列,并且查询已连接在一起(而据我所知,您当时希望将内部查询连接到外部查询)

因此,我给了表别名operation\u inner和operation\u outer,以区分列属于哪个表


我希望它能按您的要求工作。

尝试使用公共表表达式什么类型的公共表表达式?基本上您可以查询一个公共表或任意多个公共表。最后,您只需连接而不是子查询。这也应该更有效,因为您可以使用不同的“where”和“disticnt”子句查询相同的结果—您的SQL看起来非常重复和混乱。这将是地狱维持。然而,我认为问题的根源在于你没有使用别名。如果要在外部查询和子查询中使用相同的表,则需要使用别名让数据库区分这两个表。嗨,Zohar,谢谢你的回复。因为我是SQL初学者,所以我不习惯做这种请求。我的主要问题是因为有很多不同的表(使用内部连接)来连接不同的表,我不知道如何命名这些表。用几个“内部联接”来命名整个表似乎是不可能的。你有什么建议吗?谢谢你的帮助,我将重新安排我的代码,因为它真的很混乱。但allias绝对是个好主意。@MiaChen是的,让你的代码不那么凌乱肯定是个好主意:)我保留了你的查询,就像你在这里所说的那样,但我也鼓励你稍微修改一下(可能使用一些,可能会显示为一个好主意)