2014-01-14 122 views
-1

重要的是它可能以某種方式比較子查詢計數結果是這樣的:比較子查詢

SELECT 
    c_contact.id, 
    c_contact.name, 
    c_contact.firstnames, 
    c_contact.securityid 
FROM c_monitoring 
    JOIN c_contact ON c_contact.securityid = c_monitoring.securityid 
    JOIN c_ln_event_debtor ON c_ln_event_debtor.f_contact = c_contact.id 
    JOIN c_event ON c_event.id = c_ln_event_debtor.f_event 
WHERE 
    ( 
    SELECT count(c_event.id) 
    FROM c_event 
    WHERE c_event.id = c_ln_event_debtor.f_event 
    AND c_event.f_status IN(50,51,52) 
) = (
    SELECT count(c_event.id) 
    FROM c_event 
    WHERE c_event.id = c_ln_event_debtor.f_event 
) 
GROUP BY 
    c_monitoring.securityid 

我想有行結果集只有當所有引用c_event行有f_status 50或51或52我已經嘗試過,但沒有運氣。

+0

你試過這個嗎? – Rachcha

+0

這肯定是錯誤的,但對於您的預期結果,c_event和c_ln_event_debtor中的行是否應與當前的c_monitoring/c_contact相關? – regilero

+0

你真的需要通過COUNTing來完成嗎?如何不存在(選擇...哪裏f_status不在(50,51,52)) – racraman

回答

2

我喜歡這種查詢的EXISTS子句。在具有一個f_status下面我們篩選出c_events不是50,51,51:

SELECT 
    c_contact.id, 
    c_contact.name, 
    c_contact.firstnames, 
    c_contact.securityid 
FROM c_monitoring 
    JOIN c_contact ON c_contact.securityid = c_monitoring.securityid 
    JOIN c_ln_event_debtor ON c_ln_event_debtor.f_contact = c_contact.id 
    JOIN c_event ON c_event.id = c_ln_event_debtor.f_contact 
WHERE NOT EXISTS (
    SELECT 1 
     FROM c_event 
     WHERE c_event.id = c_ln_event_debtor.f_event 
     AND c_event.f_status NOT IN (50,51,52) 
    ) 

GROUP BY 
    c_monitoring.securityid 

如果以上仍然會產生意想不到的結果,那麼你可以加入到EXISTS c_ln_event_debtor:

SELECT 
      c_contact.id, 
      c_contact.name, 
      c_contact.firstnames, 
      c_contact.securityid 
     FROM c_monitoring 
      JOIN c_contact ON c_contact.securityid = c_monitoring.securityid 
      JOIN c_ln_event_debtor ON c_ln_event_debtor.f_contact = c_contact.id 
      JOIN c_event ON c_event.id = c_ln_event_debtor.f_event 
     WHERE NOT EXISTS (
      SELECT 1 
       FROM 
       c_ln_event_debtor d 
       JOIN c_event ce ON ce.id = d.f_event 
       WHERE d.f_contact = c_contact.id 
       AND ce.f_status NOT IN (50,51,52) 
      ) 

     GROUP BY 
      c_monitoring.securityid; 

編輯:我注意到加入c_event使用c_ln_event_debtor.f_contact是這個故意嗎?

+0

不起作用。如果有其他f_statuses的c_events超過50,51,52 – makallio85

+1

@AngularAddict查看你使用'f_contact'字段加入'c_event'的查詢。那是故意的嗎? – Jim

+0

@AngularAddict我已經添加了一個替代方案,如果意圖排除所有聯繫人,而該聯繫人的任何c_ln_event_debtor都有一個沒有狀態爲50,51,51的關聯事件,那麼該替代方案應該可以工作。 – Jim