Create Table #TDept --部门表 

  DeptID int  --部门ID 

Create Table #Product  --产品表 

  ProductID int  --产品ID 

Create Table #TDeptProduct --部门产品 (DeptID+ProductID 建有索引) 

  DeptID int,  --部门ID     
  ProductID int  --部门产品ID 

--插入部门数据 
Insert #TDept 
Select 8 Union 
Select 12 union 
Select 7 union 
Select 74 
--插入产品数据 
Insert #Product 
Select 23 Union 
Select 126 Union 
Select 823 Union 
Select 41 Union 
Select 1 
--插入部门产品数据 
Insert #TDeptProduct 
Select 8, 823 Union 
Select 8, 126 Union 
Select 12, 41 Union 
Select 7,  41 Union 
Select 7, 126 --查询出哪些 部门+产品 在部门产品资料中还没有存在
Select DeptID, ProductID From #TDept, #Product 
Where Cast(DeptID As Varchar) + ':' + Cast(ProductID as Varchar) Not in 
(Select Cast(DeptID As Varchar) + ':' + Cast(ProductID as Varchar) From #TDeptProduct)由于#Product 表实际有几万行数据,#Dept有几十行,#TDeptProduct 表有上百万行数据。
如果我直接执行Select DeptID, ProductID From #TDept, #Product 速度还是挺快的。可是带
上Where语句以后,速度就非常慢。而且Cast(DeptID As Varchar) + ':' + Cast(ProductID as Varchar)
的写法,索引(DeptID+ProductID)应该也不能用了。
请问: 这条SQL语句的更好的写法,可以很大程度上加快速度的? 多谢!

解决方案 »

  1.   

    你两个表没连接条件?#TDept, #Product
      

  2.   

    这样试试
    Select DeptID, ProductID From #TDept, #Product
    EXCEPT
    SELECT DeptID,ProductID FROM #TDeptProduct
      

  3.   

    try:
    select a.DeptID,b.ProductID From #TDept a,#Product b
    where not exists(select 1 from #TDeptProduct where DeptID=a.DeptID and ProductID=b.ProductID)
      

  4.   

     Cast(DeptID As Varchar) + ':' + Cast(ProductID as Varchar)
    为什么要这样
    如果是这样表设计的时候就欠考虑
    可以考虑在写入数据的时候就格式化成这样的
    或者
    对两列做个计算列 
    然后对这个列建立索引