2015-07-01 32 views
0

我想实现下面的SQL查询:假设使用JOIN子句,因为现在它的相当缓慢运行:SQL中使用两个连接的WHERE子句

SELECT ID_USER, NICK 
FROM TABLE1 
WHERE ID_USER IN 
(
    SELECT ID_INDEX1 
    FROM TABLE2 
    WHERE ID_INDEX2 = '2' 
) 
AND ID_USER NOT IN 
(
    SELECT ID_INDEX2 
    FROM TABLE2 
    WHERE ID_INDEX1 = '2' AND GO ='NO' 
) 
ORDER BY NICK ASC 
+1

如果它有很多的领域,你可以检查是否只选择你需要帮助的领域。在大多数情况下,'* *是过度杀伤性的。 –

+0

感谢您的回复。我编辑删除*的查询。任何帮助? – user3016917

+0

很难说没有你的表的执行计划和描述(索引,多少行,唯一约束......) –

回答

1

你可以做的“包括”与INNER JOIN和部分在“排除”部分有“LEFT JOIN” +过滤:

SELECT DISTINCT t1.ID_USER, t1.NICK 
FROM TABLE1 t1 
    INNER JOIN TABLE2 t2IN 
    ON t1.ID_USER = t2IN.ID_INDEX1 
    AND t2IN.ID_INDEX2 = '2' 
    LEFT JOIN TABLE2 t2OUT 
    ON t1.ID_USER = t2OUT.ID_INDEX2 
    AND t2OUT.ID_INDEX1 = '2' 
    AND t2OUT.GO = 'NO' 
WHERE t2OUT.ID_INDEX IS NULL 
ORDER BY t1.NICK ASC 
+0

它工作的很好。非常感谢!! – user3016917

0

假设你想ID_INDEX1在这两种情况下进行过滤(看到我对你的问题的评论),您可以:

  • 计数每个用户的行数与值表2 = 2
  • 计数每个用户的行数与值= 2表2和去=“NO”
  • 返回只有那些其中所述第一计数大于0且第二计数等于0

即:

select * from (
    select 
    id_user, 
    nick, 
    sum(case when table2.id_index2 = '2' then 1 else 0 end) as count2_overall, 
    sum(case when table2.id_index2 = '2' and go = 'NO' then 1 else 0 end) as count2_no 
    from table1 
    join table2 on table1.id_user = table2.id_index1 
    group by id_user, nick 
) 
where count2_overall > 0 and count2_no = 0