Sql-Server-2005
從 2 個單獨的表中選擇所有記錄
我有 2 個單獨的表,它們之間沒有連結。一個客戶表和一個產品表。
對於每個客戶,我希望為產品表中的每個產品創建一個新行,我希望結果如下所示
CustomerNumber Product 1 Item1 1 Item2 1 Item3 2 Item1 2 Item2 2 Item3 3 Item1 3 Item2 3 Item3
如何使用單個 select 語句來實現這一點?
CROSS JOIN
或將CROSS APPLY
返回“笛卡爾積”或“叉積”(即:兩個表中的每個行組合。)在這種情況下,這些運算符在功能上是等效的。-- set up our tables CREATE TABLE Customer ( CustomerNumber int ) CREATE TABLE Product ( Product varchar(15) ) INSERT INTO Customer ( CustomerNumber ) VALUES ( 1 ) , ( 2 ) , ( 3 ) INSERT INTO Product ( Product ) VALUES ( 'Item1' ) , ( 'Item2' ) , ( 'Item3' ) -- use a CROSS JOIN SELECT CustomerNumber , Product FROM Customer CROSS JOIN Product -- OR use a CROSS APPLY SELECT CustomerNumber , Product FROM Customer CROSS APPLY Product
JOIN 和 APPLY 運算符之間的區別在於 APPLY 可以在右側有一個表值函式,該函式使用左側列值中的參數值。所以 APPLY 可以做一些更高級的事情。
所有詳細資訊都在這裡: https ://docs.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql
嘗試使用
CROSS APPLY
. 這是一個例子:--demo setup Declare @Customer table (id int) Declare @Product table (ProductDesc varchar(100)) insert into @Customer(id) values(1),(2),(3) insert into @Product(ProductDesc) values('Item1'),('Item2'),('Item3') --solution using cross apply SELECT c.id ,p.ProductDesc FROM @Customer c CROSS APPLY @Product p ORDER BY c.id
id ProductDesc 1 Item1 1 Item2 1 Item3 2 Item1 2 Item2 2 Item3 3 Item1 3 Item2 3 Item3