2013-05-13 61 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