在本教程中,将学习如何使用SQL Server CROSS JOIN
连接两个或多个不相关的表。
以下是两个表的SQL Server CROSS JOIN
的语法:
SELECT
select_list
FROM
T1
CROSS JOIN T2;
CROSS JOIN
将第一个表(T1)中的每一行与第二个表(T2)中的每一行连接起来。 换句话说,交叉连接返回两个表中行的笛卡尔积。
与INNER JOIN或LEFT JOIN不同,交叉连接不会在连接的表之间建立关系。
假设T1
表包含三行:1
,2
和3
,T2
表包含三行:A
,B
和C
。
CROSS JOIN
从第一个表(T1)获取一行,然后为第二个表(T2)中的每一行创建一个新行。 然后它对第一个表(T1)中的下一行执行相同操作,依此类推。
在此图中,CROSS JOIN
总共创建了9
行。 通常,如果第一个表有n
行,第二个表有m
行,则交叉连接将产生n x m
行。
SQL Server CROSS JOIN示例
以下语句返回所有产品和商店的组合。 结果集可用于月末和年终结算期间的盘点程序:
SELECT
product_id,
product_name,
store_id,
0 AS quantity
FROM
production.products
CROSS JOIN sales.stores
ORDER BY
product_name,
store_id;
执行上面查询语句,得到以下结果:
以下语句查找商店中没有销售的产品:
SELECT
s.store_id,
p.product_id,
ISNULL(sales, 0) sales
FROM
sales.stores s
CROSS JOIN production.products p
LEFT JOIN (
SELECT
s.store_id,
p.product_id,
SUM (quantity * i.list_price) sales
FROM
sales.orders o
INNER JOIN sales.order_items i ON i.order_id = o.order_id
INNER JOIN sales.stores s ON s.store_id = o.store_id
INNER JOIN production.products p ON p.product_id = i.product_id
GROUP BY
s.store_id,
p.product_id
) c ON c.store_id = s.store_id
AND c.product_id = p.product_id
WHERE
sales IS NULL
ORDER BY
product_id,
store_id;
执行上面查询语句,得到以下结果: