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是的,让你的代码不那么凌乱肯定是个好主意:)我保留了你的查询,就像你在这里所说的那样,但我也鼓励你稍微修改一下(可能使用一些,可能会显示为一个好主意)