2011-12-21 68 views
1

我有兩個大表:SQL減去大型數據集

products 
-------- 
id (char) (primary key) 
somefield1 (char) 
somefield2 (char) 

expired_products 
------ 
id (char) (primary key) 

我想只有那些在產品,但都沒有過期身份證(未在expired_products中)。在MS Access中,我會這樣做

SELECT products.* 
FROM products LEFT JOIN expired_products ON products.id = expired_products.id 
WHERE expired_products.id Is Null; 

最終,我想將查詢的結果寫入新表。

在SQL Server Compact(sdf文件)中是否有更好的(更快的查詢)解決方案?

Btw。我使用C#並使用SqlCeConnection訪問數據庫。

回答

2
create table new_table (
    id char(7) -- same as primary key in products 
) 

這是命令在C#中執行,這是 「insert into ... select ...」 聲明:

insert into new_table (id) 
select p.id 
from products p 
where not exists (select 1 from expired_products e.id = p.id) 

新增後評論:

INSERT (SQL Server Compact) on MSDN

INSERT [INTO] 
     table_name [ (column_list) ] 
     { VALUES 
     ({ DEFAULT | NULL | expression } [ ,...n]) 
| derived_table 
     } 

從MSDN:

derived_table
任何有效SELECT語句返回的數據行被插入到表。

+0

但插入不受SQL Server精簡 – ErikEJ 2011-12-21 12:33:35

+0

@ErikEJ支持,我根據我的答案已經添加信息。 – 2011-12-21 12:46:23

+0

你是對的,感謝我整理出來 – ErikEJ 2011-12-21 14:06:58

4

在標準SQL和SQL Server的減運算是EXCEPT

SELECT id 
    FROM products 
EXCEPT 
SELECT id 
    FROM expired_products; 

...但它似乎EXCEPT沒有在緊湊型4.0 :(

支持與SQL一如以往,是執行semi difference的替代方式:

例如NOT EXISTS

SELECT * 
    FROM products AS p 
WHERE NOT EXISTS (
        SELECT * 
        FROM expired_products AS e 
        WHERE p.id = e.id 
       ); 

例如NOT IN

SELECT * 
    FROM products 
WHERE id NOT IN (SELECT id FROM expired_products); 
+0

但EXCEPT不支持SQL Server Compact – ErikEJ 2011-12-21 12:33:47

+0

@ErikEJ:我已經更新了我的答案。謹慎在這裏投一些票? ;) – onedaywhen 2011-12-21 14:18:55