簡體   English   中英

SQL JOIN與兩個位置的子句

[英]SQL JOIN WITH TWO WHERE CLAUSES

我想實現以下SQL查詢:假設使用JOIN子句,由於它現在運行非常慢:

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

您可以使用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

假設在兩種情況下都希望按ID_INDEX1進行過濾(請參閱我對問題的評論),您可以:

  • 計算table2中每個用戶的行數,值= 2
  • 計算table2中每個用戶的行數,其值為= 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM