【发布时间】:2013-11-16 20:29:55
【问题描述】:
我正在阅读一本书“在 Microsoft SQL Server 2008 内部:T-SQL 查询*,它通过一个示例说明,当在两个表之间进行任何连接时,首先在它们之间发生笛卡尔积,然后使用 ON 条件对其进行过滤然后按“RIGHT”、“LEFT”或“FULL”连接类型。
从那本书的一个例子,
SELECT C.customerid, COUNT(O.orderid) AS numorders
FROM dbo.Customers AS C
LEFT OUTER JOIN dbo.Orders AS O
ON C.customerid = O.customerid
Customer 表有 4 行,Orders 有 7 行。因此,第一个笛卡尔积将生成 4*7 = 28 行,然后将通过“ON”子句和 LEFT OUTER 进行过滤。
这是否意味着无论我使用哪种连接类型,每次笛卡尔积都会在表之间发生?那么为什么我们会看到不同连接之间的性能差异呢?
【问题讨论】:
-
对不起我的英语不好..可能是因为我无法清楚地理解那本书的内容
-
试试
CROSS JOIN声明 -
@Aycan 我没听懂你。我的问题的目的是了解内部 t-sql 的工作原理。
-
@AycanYaşıt 我相信 OP 想知道左连接是否实际上可以被视为后来过滤的交叉连接,或者它是 SQL Server 内部实际发生的情况。
-
抱歉,我当时没收到问题。
标签: sql-server-2008 tsql join cartesian-product