Mia Chen
Mia Chen

Reputation: 173

SQL, use the result of main query into a sub query

I am trying to add a column into my view. This column uses the previous result to calculate the new value.

However, it seems that it is not possible to use the result of the main query into the subquery.

To simplify the problem, it would give :

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

However, it does not work.

enter image description here

If I wrote the following, it works:

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

enter image description here

It seems that SQL tries to extract all number where we have the condition Operation = Corrective. WhereAs what I actually want is to take the previous Tab corrective result and inject it into my subquery. How should I do?

This is the real code :

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 

Upvotes: 2

Views: 140

Answers (1)

Goran Kutlaca
Goran Kutlaca

Reputation: 2024

Try the following code:

  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

The thing is in differentiating to what exactly dbo.Operation table is which column connected.

For example when you wrote WHERE dbo.Operation.Id = dbo.Operation.CorectiveId it was as columns from the same table and query has been connected together (while you, as I understood it, wanted to connect inner query to outer query at that point).

Therefor, I gave tables aliases operation_inner and operation_outer, to differentiate to which table what column belongs.

i hope it's working as you want it.

Upvotes: 1

Related Questions