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

错误 - 关键字“on”附近的语法不正确。

为什么第二个查询错误?它在概念上与第一个不一样吗?那就是在 join 里面创建一个结果集。我们选择 * 结果集,然后将此结果集加入 CurrentProducts ?

4

2 回答 2

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
于 2013-05-13T10:29:14.777 回答
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
于 2013-05-13T10:28:21.633 回答