Sql-Server-2005

從 2 個單獨的表中選擇所有記錄

  • November 8, 2019

我有 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

引用自:https://dba.stackexchange.com/questions/252700