2013-05-19 28 views
0

我有一個表與下面的列查詢找到重複的,但不包括設置

Emp_id 
Work_date 
element 

我要查詢(以下查詢修改後的版本),如果有超過1個一行將返回單行在上表中給出work_date和員工id(GROUP BY EMP_ID和WORK_DATE)。所以我寫了查詢,如:

SELECT EMP_ID, WORK_DATE FROM myTable 
where WORK_DATE = :p_WorkDate 
GROUP BY EMP_ID, WORK_DATE 
HAVING COUNT (1) > 1 

例如:

EMP_ID WORK_DATE 
1  1/1/2013 
1  1/1/2013 
2  1/1/2013 

查詢應該返回如下如果我通過2013年1月1日爲:p_WorkDate:

1 1/1/2013 

基本上我我試圖找出EMP_ID和WORK_DATE是否有多於1行,但是對於ELEMENT列包含的額外要求 - 如果它包含來自集合(element1 + element2)或(element3 + element4)的值。

附加要求(以下)取決於元素列包含的內容(如果行具有來自set的值)。

1)有2行與相同EMP_ID和work_date和元件列中的一個被元素1和其他元件列在element2(一組元素1和要素2)

的例如:

EMP_ID WORK_DATE element 
1 1/1/2013 element1 
1 1/1/2013 element2 

因爲即使有兩行查詢應不返回任何行,這是一組(部件1和elelement2)

2)有2排與元件列的相同EMP_ID和work_date一個是元素3和其他元素列是元素T4(一組元素3和元素4)

例如:

EMP_ID WORK_DATE element 
1 1/1/2013 element3 
1 1/1/2013 element4  

因爲即使有兩行查詢應不返回任何行,它是一組(元素3和元素4)

3)如果有2行與相同EMP_ID和work_date並且不是一組如上應返回的行

例如:

EMP_ID WORK_DATE element 
1 1/1/2013 element1 
1 1/1/2013 xxx 

(相同的結果,如果元件管柱element2的代替元素1)

查詢應該返回如果我通過2013年1月1日爲如下:p_WorkDate:

1 1/1/2013 

4)如果有多於2行具有相同的emp_id和work_date,無論哪個元素列包含,都應該返回一行。

例如:

EMP_ID WORK_DATE element 
1 1/1/2013 element1 
1 1/1/2013 element2 
1 1/1/2013 xxx 

查詢應該返回如果我通過2013年1月1日爲如下:p_WorkDate:

1 2013年1月1日


謝謝

+0

這些組對存儲在哪裏?此外,計數(1)通常是計數(*) - 計數(1)沒有優勢,而非常規性則是缺點。 –

+0

@DavidAldridge - 對可以在查詢中進行硬編碼 – user1663715

回答

1

給這個去...我想我得到了邏輯直接:

select 
    emp_id, 
    work_date 
from (
    select 
    emp_id, 
    work_date, 
    min(element) min_element, 
    max(element) max_element, 
    count(*) rows_counted 
    from 
    mytable 
    where 
    work_date = :p_workdate 
    group by 
    emp_id, 
    work_date 
    having 
    count (*) > 1) 
where 
    rows_counted > 2 or 
    (min_element,max_element) not in (select 'element1' el1, 'element2' el2 from dual union all 
            select 'element3' el1, 'element4' el2 from dual) 
1

這是一組中之設定的子查詢的例子,你可以做一切工作的having子句中:

SELECT EMP_ID, WORK_DATE 
FROM myTable 
where WORK_DATE = :p_WorkDate 
GROUP BY EMP_ID, WORK_DATE 
HAVING sum(case when element not in ('element1', 'element2', 'element3', 'element4') 
       then 1 else 0 
      end) > 0 or 
     (sum(case when element in ('element1', 'element2') > 0 and 
     sum(case when element in ('element3', 'element4') > 0 
     ) 

的邏輯。 having語句中的第一個子句是關於不在這兩個集合中的任何元素。如果有一個,則返回一行。

第二個條件是當兩個元素都有元素時。在這種情況下,你也會返回一行。如果所有行都只有一組元素,那麼就沒問題。

您的規則對於有三個行有重複的情況是不明確的,例如兩個'element1'和一個'element2'。有了這個公式就沒問題。希望你看到如何擴展having條款確切的情況。