2015-06-24 5 views
1

Возможно ли связать внешний запрос с внутренним запросом в контексте соединения? «Где (sid.ItemID = i.itemID)» внутреннего запроса дает мне ошибку. Я думал, что сделал это в прошлом, поэтому я просматриваю все мои сохраненные процедуры, но, видимо, я сделал какую-то замену, чтобы заставить его работать. Я подозреваю, что могу удалить эту строку, и она будет работать, но более эффективна ли она с этой внутренней фразой?Внешний запрос ссылки SQLServer

SELECT departmentName 
     , supplierName 
     , so.SalesOrderID 
     , ss.warehouseInvoiceNo 
     , ss.transactionNo 
     , ss.storeID 
     , s.storeName 
     , s.storeNo 
     , tr.transactionDate 
     , p.period 
     , sooos.salesOrderID 
     , sooos.salesOrderOutOfStockID 
     , sooos.itemID 
     , i.itemNo 
     , i.itemName 
     , i.pack 
     , i.unitSize 
     , quantity 
     , wi.available 
FROM SalesOrderOutOfStock sooos 
     JOIN Item AS i ON i.ItemID = sooos.ItemID 
     JOIN SalesOrder so ON so.SalesOrderID = sooos.SalesOrderID 
     JOIN WarehouseInventory wi ON wi.ItemID = sooos.ItemID 
     JOIN Store s ON s.StoreID = so.StoreID 
     JOIN InvoiceOrderRelationship ior ON ior.SalesOrderID = so.SalesOrderID 
     JOIN StockSale ss ON ss.WarehouseInvoiceNo = ior.WarehouseInvoiceNo 
     JOIN TransactionRegister tr ON tr.TransactionNo = ss.TransactionNo 
     JOIN Period p ON p.PeriodID = tr.PeriodID 
     JOIN Department d ON d.DepartmentID = i.DepartmentID 
     LEFT OUTER JOIN (SELECT TOP 1 itemID 
            , supplierID 
         FROM SupplierInvoiceDetail sid 
           JOIN SupplierInvoice si ON si.SupplierInvoiceID = sid.SupplierInvoiceID 
         --where (sid.ItemID = i.itemID) 
         order by InvoiceDate desc 
         --NEED AN ORDER BY HERE 
         ) AS lastSupplier ON lastSupplier.ItemID = i.ItemID 
     JOIN supplier su ON su.SupplierID = Isnull(lastSupplier.supplierID, i.supplierID) 
WHERE ss.WarehouseInvoiceNo = 10000000 

- $ P {InvoiceNo}

+0

hmmm ... не уверен, почему он отформатирован так –

+0

Используйте ['OUTER APPLY'] (https://technet.microsoft.com/en-us/library/ms175156%28v=sql.105%29. aspx) вместо 'LEFT JOIN', это даст вам доступ к внешним полям. – GarethD

+1

Форматирование: [Как отформатировать мои сообщения с помощью Markdown или HTML] (http://stackoverflow.com/help/formatting) (Или вы можете просто выделить блок кода и нажать кнопку '{}') –

ответ

2

Вы должны использовать OUTER APPLY здесь, а не LEFT JOIN:

OUTER APPLY (SELECT TOP 1 itemID 
           , supplierID 
        FROM SupplierInvoiceDetail sid 
          JOIN SupplierInvoice si ON si.SupplierInvoiceID = sid.SupplierInvoiceID 
        where (sid.ItemID = i.itemID) order by InvoiceDate desc 
        ) AS lastSupplier 

подзапросов, введенные в FROM или JOIN положений не может ссылаться на других источников таблицы в том же FROM (фактически, все они должны оцениваться одновременно). APPLY позволяет ввести определенную зависимость в оценке.

Смежные вопросы