2013-05-13 60 views
0

我試圖加入3個表格 - CurrentProducts,SalesInvoice和SalesInvoiceDetail。 SalesInvoiceDetail包含其他兩個表和其他一些列的FK /外鍵。第一個查詢是可以的,但第二個查詢不是。我的問題出現在代碼的最後。需要正確理解多個連接

select * 
from CurrentProducts inner join 
(dbo.SalesInvoiceDetail inner join dbo.SalesInvoice 
on dbo.SalesInvoiceDetail.InvoiceID = dbo.SalesInvoice.InvoiceID 
) 
on dbo.SalesInvoiceDetail.ProductID = dbo.CurrentProducts.ProductID 

錯誤

select * 
from CurrentProducts inner join 
(select * from 
dbo.SalesInvoiceDetail inner join dbo.SalesInvoice 
on dbo.SalesInvoiceDetail.InvoiceID = dbo.SalesInvoice.InvoiceID 
) 
on dbo.SalesInvoiceDetail.ProductID = dbo.CurrentProducts.ProductID 

錯誤 - '上' 關鍵字附近有語法錯誤。

爲什麼第二個查詢是錯誤的?在概念上與第一個不一樣嗎?那是在連接結果集裏。我們選擇*結果集,然後將此結果集加入CurrentProducts?

+0

嘗試添加別名子查詢和使用它,就像這樣:SELECT * 從CurrentProducts內加入 (SELECT * FROM dbo.SalesInvoiceDetail內上dbo.SalesInvoiceDetail.InvoiceID = dbo.SalesInvoice.InvoiceID 加入dbo.SalesInvoice )SID 上sid.ProductID = dbo.CurrentProducts.ProductID – Eugene 2013-05-13 10:28:16

回答

1

第一個查詢是使用較早的語法表示的「普通」連接。它可以被重寫爲:

select 
    * 
from 
    CurrentProducts 
    inner join dbo.SalesInvoiceDetail 
      on dbo.SalesInvoiceDetail.ProductID = dbo.CurrentProducts.ProductID 
    inner join dbo.SalesInvoice 
      on dbo.SalesInvoiceDetail.InvoiceID = dbo.SalesInvoice.InvoiceID 

第二個查詢是第二個表是子查詢的聯接。當您在一個子查詢加入,您必須將別名分配給它,並使用別名來引用子查詢返回的列:

select 
    * 
from 
    CurrentProducts 
    inner join (select * 
       from dbo.SalesInvoiceDetail 
       inner join dbo.SalesInvoice 
         on SalesInvoiceDetail.InvoiceID = SalesInvoice.InvoiceID 
) as foo on foo.ProductID = dbo.CurrentProducts.ProductID 
+0

請告訴我如何做別名?我在另一個答案中嘗試了給定的別名,但它不起作用。 – 2013-05-13 10:30:47

+0

同樣的錯誤 - 爲'foo'多次指定'InvoiceID'列。 – 2013-05-13 10:32:45

+1

@ sequel.learner不要使用'select *',從子查詢中明確列出你需要的列。它也會出現,你不需要一個子查詢,而是一個普通的連接。 – GSerg 2013-05-13 10:36:10

1

您需要別名內部查詢。另外,第一個括號不需要。

select * 
from CurrentProducts inner join 
(select * from 
dbo.SalesInvoiceDetail inner join dbo.SalesInvoice 
on dbo.SalesInvoiceDetail.InvoiceID = dbo.SalesInvoice.InvoiceID 
) A 
on A.ProductID = dbo.CurrentProducts.ProductID 
+0

錯誤 - 列' InvoiceID'被多次指定爲'A'。 – 2013-05-13 10:30:05

+1

請勿選擇所有列,只能選擇實際使用的列。您有2個「InvoiceID」列被選中。 – kyooryu 2013-05-13 10:32:31