【问题标题】:SQL Minus in SQL Compact for large datasetsSQL Compact 中用于大型数据集的 SQL 减号
【发布时间】:2011-12-21 22:16:25
【问题描述】:

我有两张大桌子:

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

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

我只想拥有那些在产品中但未过期的 id(id 不在 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 文件)中是否有更好(查询更快)的解决方案?

顺便说一句。我正在使用 C# 并使用 SqlCeConnection 来访问数据库。

【问题讨论】:

    标签: c# sql performance sql-server-ce


    【解决方案1】:

    标准 SQL 和 SQL Server 中的减号运算符是EXCEPT

    SELECT id 
      FROM products
    EXCEPT
    SELECT id 
      FROM expired_products;
    

    ...但在 Compact 4.0 中似乎不支持 EXCEPT :(

    与 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);
    

    【讨论】:

    • 但 SQL Server Compact 不支持 EXCEPT
    • @ErikEJ:我已经更新了我的答案。想在这里投一些票吗? ;)
    【解决方案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:

    派生表
    任何返回要插入到表中的数据行的有效 SELECT 语句。

    【讨论】:

    • 但是 SQL Server Compact 不支持插入
    • @ErikEJ,我基于我在回答中添加的信息。
    猜你喜欢
    • 2011-06-03
    • 1970-01-01
    • 2012-11-23
    • 2018-01-27
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2018-09-30
    相关资源
    最近更新 更多