2015-07-01 31 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