2016-04-22 79 views
6

這裏是我的測試表中的數據:如何比較同一個表中的記錄列?

測試

ID  Name   Payment_Date Fee    Amt 
1  BankA   2016-04-01  100    20000 
2  BankB   2016-04-02  200    10000 
3  BankA   2016-04-03  100    20000 
4  BankB   2016-04-04  300    20000 

我想比較的每個數據記錄的字段名稱,手續費及金額,看看是否有相同的值或沒有。如果它們具有相同的價值,我想在這些記錄上標記「Y」。這裏是預期的結果

ID  Name   Payment_Date Fee    Amt  SameDataExistYN 
1  BankA   2016-04-01  100    20000 Y 
2  BankB   2016-04-02  200    10000 N 
3  BankA   2016-04-03  100    20000 Y 
4  BankB   2016-04-04  300    20000 N 

我已經嘗試了以下兩種方法。但我正在尋找其他解決方案,以便我可以爲我的工作挑選出最好的解決方案。

方法1.

select t.*, iif((select count(*) from testing where name=t.name and fee=t.fee and amt=t.amt)=1,'N','Y') as SameDataExistYN from testing t 

方法2

select t.*, case when ((b.Name = t.Name) 
         and (b.Fee = t.Fee) and (b.Amt = t.Amt)) then 'Y' else 'N' end as SameDataExistYN 
from testing t 
left join (select Name, Fee, Amt 
      from testing 
      Group By Name, Fee, Amt 
      Having count(*)>1 ) as b on b.Name = t.Name 
             and b.Fee = t.Fee 
             and b.Amt = t.Amt 
+0

你只是想找到重複的記錄嗎? – karina

+0

是啊!我試圖找到重複的記錄並標記它 –

+0

我認爲你的第一種方法是不正確的,因爲它只是按名稱比較。 –

回答

1

這是另一種方法,但我認爲你必須運行在你的數據進行測試,以找出哪些是最好的:

SELECT 
    t.*, 
    CASE WHEN EXISTS(
    SELECT * FROM testing WHERE id <> t.id AND Name = t.Name AND Fee = t.Fee AND Amt = t.Amt 
) THEN 'Y' ELSE 'N' END SameDataExistYN 
FROM 
    testing t 
; 
+0

哇!這個工作比我的珍貴方法完美和快速。謝謝 –

3

有幾種方法,而其性能特性的差異。

一種選擇是運行相關的子查詢。如果您有合適的索引,並且您拉的行數相對較少,則此方法最適合。

SELECT t.id 
    , t.name 
    , t.payment_date 
    , t.fee 
    , t.amt 
    , (SELECT 'Y' 
      FROM testing s 
      WHERE s.name = t.name 
      AND s.fee = t.fee 
      AND s.amt = t.amt 
      AND s.id <> t.id 
      LIMIT 1 
     ) AS SameDataExist 
    FROM testing t 
WHERE ... 
LIMIT ... 

當找到至少一個「匹配」行時,SELECT列表中的相關子查詢將返回Y.如果未找到「匹配」行,則SameDataExist列的值將爲NULL。要將NULL轉換爲'N',可以將子查詢包裝在IFULL()函數中。


你的方法2是一個可行的方法。 SELECT列表中的表達式不需要進行所有這些比較,這些比較已經在連接謂詞中完成了。所有你需要知道的是一個匹配的行是否被找到......只需測試NULL/NOT NULL列的其中一個就足夠了。

SELECT t.id 
    , t.name 
    , t.payment_date 
    , t.fee 
    , t.amt 
    , IF(s.name IS NOT NULL,'Y','N') AS SameDataExists 
    FROM testing t 
    LEFT 
    JOIN (-- tuples that occur in more than one row 
     SELECT r.name, r.fee, r.amt 
      FROM testing r 
      GROUP BY r.name, r.fee, r.amt 
     HAVING COUNT(1) > 1 
     ) s 
    ON s.name = t.name 
    AND s.fee = t.fee 
    AND s.amt = t.amt 
WHERE ... 

你也可以使用一個EXISTS(相關子查詢)的

+0

這真的幫了我很多的謝意 –

1

選擇t.name,t.fee,t.amt,如果(COUNT(*)> 1),」 Y','N')t.name,t.fee,t.amt

相關問題