sql - 没有交叉连接的未售出产品查询?

标签 sql tsql sql-server-2008-r2 reporting cross-join

我正在为“未售出的产品”开发一个存储过程。

以下是我迄今为止采用的方法的总结。

注意:生产中最多有 7 种产品,销售表中大约有 18,000 种相对于当前数量缓慢增长。

我的问题是:我是否可以考虑另一种方法来避免爆炸式交叉连接的潜在陷阱?

declare @products table (
    productName varchar(50)
)

declare @customers table (
    customerName varchar(50)
)

declare @sales table (
    customerName varchar(50),
    productName varchar(50)

)

insert into @products values ('Product1'), ('Product2')

insert into @customers values ('Customer1'), ('Customer2')

insert into @sales values
     ('Customer1', 'Product1')
    ,('Customer1', 'Product2')
    ,('Customer2', 'Product1')

-- want a row for each customer and each product they
-- have not been sold 
select *
from @customers C
cross join @products P
where not exists(select productName 
                 from @sales S
                 where S.customerName = C.customerName and
                       S.productName = P.productName)

最佳答案

我认为你做的是对的,但你可以检查 EXCEPT 是否给你更好的性能:

select C.CustID, P.ProdID
from @customers C
cross join @products P
EXCEPT
SELECT CustID, ProdID
from @sales S
group by CustID, ProdID

显然,如果您可以减少客户名单,那将会有所帮助,例如消除去年没有购买任何东西的人。

关于sql - 没有交叉连接的未售出产品查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19599720/

相关文章:

TSQL 分组 N 秒

sql - 在 Sql Server 中对多列使用 GROUP BY 时如何选择最长的字符串

sql - SQL Server 2008 上的 "Cannot specify decimal(5,2) data type (parameter 4) as a substitution parameter"错误

mysql - 请解释2条SQL语句之间的差异

mysql - 我正在尝试解析本地磁盘上的 350 个文件并将数据作为 json 对象存储到数据库中

sql-server - 如何在 T-SQL 中按递增顺序替换重复字符串?

sql - 根据 SQL Server 位置重新排序行

triggers - SQL Server 触发器不插入行

c# - 将多个 SQL 文件合并为一个 SQL 文件

sql - 如何将此用于生成菜单层次结构的过程 SQL 代码转换为基于 SET 的方法?