如何在SQL

时间:2016-09-12 10:03:04

标签: sql

我有两张桌子 - 顾客和产品,我有10个顾客和5个产品。

我可以通过查询加入:

select 
    ca.id as customer_id,p.id as product_id
from 
    customeraccount ca  
left join 
    product p on ca.id = p.customeraccountid

如何重新获得类似于笛卡儿但不是笛卡儿的新表,如下所示:

enter image description here

Flaq是一个变量,表示该客户是否有此产品。

2 个答案:

答案 0 :(得分:1)

CROSS JOIN可以解决您的问题

SELECT ca.id as customer_id,
       p.id as product_id,
       CASE WHEN ca.id=p.customeraccountid THEN 1 ELSE 0 END AS Flag
FROM  customeraccount ca  
CROSS JOIN product p 

答案 1 :(得分:1)

如果您有两个表,您应该重新考虑您的设计。您至少应该为您的客户提供一个表格,一个用于您的产品,一个用于实际销售(或者您想在此处做的任何事情......)。

由于你是新来的,请给我一个提示:帮助SO社区一个好MCVE。在这里,我为你创建一个:

SQL-Server语法......

DECLARE @customer TABLE(CustomerID INT);
INSERT INTO @customer VALUES(1001),(1002),(1003);
DECLARE @prod TABLE(ProdID INT);
INSERT INTO @prod VALUES(1),(2),(3);
DECLARE @sales TABLE(CustomerID INT,ProdID INT);
INSERT INTO @sales VALUES(1001,1),(1001,3)
                        ,(1002,1),(1002,2)
                        ,(1003,2);

SELECT c.CustomerID
      ,p.ProdID
      ,CASE WHEN s.CustomerID IS NULL THEN 0 ELSE 1 END AS HasSale 
FROM @customer AS c
CROSS JOIN @prod AS p
LEFT JOIN @sales AS s ON s.ProdID=p.ProdID AND s.CustomerID=c.CustomerID

结果

Cust   Prod HasSales
1001    1   1
1001    2   0
1001    3   1
1002    1   1
1002    2   1
1002    3   0
1003    1   0
1003    2   1
1003    3   0