有两个表
table_A:
name1
name2table_B:
name,有索引table_B_idx第一段语句
select * from table_A a
where exists (select null from table_B where a.name1=b.name or a.name2=b.name);
第二段语句
select * from table_A a
where a.name1 in (select name from table_B) or  a.name2 in (select name from table_B);

解决方案 »

  1.   

    没有一定之规。 内表外表大小不同时结果又不一样。
    一般内表小外表大用 in , 其它情况用 exists .实际还是要看执行计划和消耗。如果一切都有个万无一失的固定说法, 就没有DBA这个职业了。
      

  2.   

    sql server 会自动优化语句,选择较好的执行计划去执行sql。所以还是看执行计划是否一样才能判断,受数据量、索引、其他约束等,生产的执行计划也会不一样。也许你的两个sql查询执行计划是一样的。索引都会有用到。但写法来说,第一种用exists比较保证数据准确性(看怎么要求吧)如下栗子:
    -- table_B 字段name 只要有一个空值(null),整个查询就没有结果!
    select * from table_A where name1 in(select name from table_B)-- table_B 没有字段name1,但是下面的执行不会出错!
    select * from table_A where name1 in(select name1 from table_B)