2014-01-15 59 views
0

我想知道expirationDate已更改哪些折扣ID。這是表格的快照。我需要做一個自我加入。我想知道expirationDate已更改哪些折扣ID。這是表格的快照。我需要自己加入

tablename discountid expirationdate 
NEW  182150  2013-12-02 00:00:00.000 
OLD  182150  2099-12-31 00:00:00.000 
NEW  182151  2013-12-02 00:00:00.000 
OLD  182151  2099-12-31 00:00:00.000 
NEW  182152  2013-12-02 00:00:00.000 
OLD  182152  2099-12-31 00:00:00.000 
NEW  192608  2013-12-02 00:00:00.000 
OLD  192608  2099-12-31 00:00:00.000 
NEW  192609  2013-12-02 00:00:00.000 
OLD  192609  2099-12-31 00:00:00.000 
+0

表名\t \t discountid EXPIRATIONDATE NEW \t \t 182150 2013年12月2日00:00:00.000 OLD 2099-12-31 00:00:00.000 NEW 2013-12-02 00:00:00.000 OLD 2099年12月31日00:00:00.000 NEW \t \t 182152 2013年12月2日00:00:00.000 OLD \t \t 182152 2099年12月31日00:00:00.000 NEW \t \t 192608 2013-12- 02 00:00:00.000 OLD \t \t 192608 2099年12月31日00:00:00.000 NEW \t \t 192609 2013年12月2日00:00:00.000 OLD \t \t 192609 2099年12月31日00:00: 00.000 – Ann

+0

不知道如何使數據看起來像一個表。 – Ann

+0

你的查詢到目前爲止是什麼樣的? –

回答

1

從我瞭解,你不只是找到期日期的更改意見,而是幾列。這裏是一個解決方案:

select discountid 
, decode(min(a),max(a),0,1) as a_changed 
, decode(min(b),max(b),0,1) as b_changed 
, decode(min(c),max(c),0,1) as c_changed 
from test 
group by discountid 
having 
    decode(min(a),max(a),1,0) = 0 or 
    decode(min(b),max(b),1,0) = 0 or 
    decode(min(c),max(c),1,0) = 0; 

編輯:對於非Oracle DBMS:

select discountid 
, case when (min(a) = max(a) then 0 else 1 end as a_changed 
, case when (min(b) = max(b) then 0 else 1 end as b_changed 
, case when (min(c) = max(c) then 0 else 1 end as c_changed 
from test 
group by discountid 
having 
    min(a) <> max(a) or 
    min(b) <> max(b) or 
    min(c) <> max(c); 
+0

對不起,這不適合我。我得到這個錯誤。 'decode'不是公認的內置函數名稱。 – Ann

+1

是的,對不起,這是Oracle。我將編輯我的答案。 –

+1

完成。但是,非Oracle查詢不考慮從或到NULL的更改。如果你想檢測這些,你將不得不相應地改變比較。 –

1

這裏是要找到具有表中兩個不同的到期日期的ID的一種方法:

select discountid 
from mytable 
group by discountid 
having count(distinct expirationdate) > 1; 
+0

謝謝,你的查詢比我有的要好,但請看看我真正需要什麼。 – Ann

1

你可以試試以下兩種方法之一:

SELECT NEW.discountid, OLD.expirationdate, NEW.expirationdate 
FROM NEW JOIN OLD ON(NEW.discountid=OLD.discountid) 
WHERE OLD.expirationdate != NEW.expirationdate 

(如果新和舊的是你的兩張桌子)

SELECT NEW.discountid, OLD.expirationdate,NEW.expirationdate 
FROM SINGTAB NEW JOIN SINGTAB OLD ON(NEW.discountid=OLD.discountid) 
WHERE NEW.tablename='NEW' AND OLD.tablename='OLD' AND OLD.expirationdate != NEW.expirationdate 

(如果數據是在一個名爲SINGTAB表,表名是SINGTAB列)

+0

上面的查詢將帶回已更改的discountid,但我也需要比較2行中的所有列(未顯示上述數據中的所有列),並找到說明哪些列已更改的方法。每個discountid有2行。 – Ann

+0

對不起,我的水晶球目前在維修店。 – Alexander

相關問題