2010-08-12 57 views
4

我有類似下面的表格:如何檢查列表有任何不同的價值

(date1, date2, date3, date4, date5) 

,我要檢查是否有這些日期比其他任何不同。 瑣碎的解決方案是:

WHERE date1 <> date2 
    OR date1 <> date3 
    OR date1 <> date4 
    OR date1 <> date5 
    OR date2 <> date3 
    OR date2 <> date4 
    OR date2 <> date5 
    OR date3 <> date4 
    OR date3 <> date5 
    OR date4 <> date5 

任何非平凡的解決方案?

+0

那麼每行都有5個日期嗎?你只關心每個日期在行中是唯一的? – automatic 2010-08-12 18:26:29

+0

日期?或日期與時間? – gbn 2010-08-12 18:49:40

回答

2

如果表中有一個主關鍵,我想這不是微不足道的。

select key, "There are duplicates" 
from 
(
    select key,date1 from table 
    union all 
    select key,date2 from table 
    union all 
    select key,date3 from table 
    union all 
    select key,date4 from table 
    union all 
    select key,date5 from table 
) as aa 
group by 
    key, date1 
having 
    count(*) > 1 
0

組的每一個值,比較由計數分組到原來的數

0

如果您正在使用SQL Server 2005 +,你可以這樣做:

With Dates As 
    (
    Select PK, 'Date1' As DateType, Date1 As [Date] From Table 
    Union All Select PK, 'Date2', Date2 From Table 
    Union All Select PK, 'Date3', Date3 From Table 
    Union All Select PK, 'Date4', Date4 From Table 
    Union All Select PK, 'Date5', Date5 From Table 
    ) 
Select D.PK, D.DateType, D.[Date] 
From Dates As D 
Where Exists (
       Select 1 
       From Dates As D1 
       Where D1.PK = D.PK 
        And D1.[Date] <> D.[Date] 
       ) 
5

正如順便說一句,你的平凡的情況下真的可以簡化爲

WHERE date1 <> date2 
    OR date1 <> date3 
    OR date1 <> date4 
    OR date1 <> date5 

使用DeMorgan's Law,這是一樣的

WHERE NOT(date1 = date2 
     AND date1 = date3 
     AND date1 = date4 
     AND date1 = date5) 

,然後通過的對transitive propertyequality relation,我們知道如果date1等於其他4個值,那麼所有5個都相等。

+0

我剛剛提出了相同的答案,但你打敗了我...... :)我同意這是最簡單的解決方案。 – Bomlin 2010-08-12 18:59:36

+0

+1很高興看到應用某種邏輯,而非人爲設計的集合 – gbn 2010-08-12 19:02:32

+0

+1假設沒有空值。 – 2010-08-13 12:40:25

0

這對我來說更容易用一個例子來描繪。這有效,但我不確定是否過於複雜。

CREATE TABLE #Dates(ID int, date1 datetime, date2 datetime, date3 datetime, date4 datetime) 
INSERT INTO #Dates VALUES(1, '1 Jan 2008', '2 Feb 2979', '8 Nov 1967', '31 Dec 2001') 
INSERT INTO #Dates VALUES(2, '1 Jan 2008', '1 Jan 2008', '1 Jan 2008', '1 Jan 2008') 
INSERT INTO #Dates VALUES(3, '1 Jan 2008', '1 Jan 2008', '1 Jan 2008', '31 Jan 2008') 
INSERT INTO #Dates VALUES(4, '1 Jan 2008', '1 Jan 2008', '31 Jan 2008', '1 Jan 2008') 

-- look at example data - note only row 2 has all 4 dates the same 
SELECT * FROM #Dates 

-- return rows where the dates are not all the same 
SELECT ID as RowsWithDatesNotAllTheSame 
FROM 
    (
    SELECT ID, Date 
    FROM 
     (
     SELECT ID, DateCol, Date 
     FROM 
      (SELECT ID, date1, date2, date3, date4 
      FROM #Dates) p 

     UNPIVOT 
      (Date FOR DateCol IN 
       (date1, date2, date3, date4) 
     ) AS unpvt 
     ) x 
    GROUP BY ID, Date 
    ) y 
GROUP BY ID 
HAVING count(*) > 1 
相關問題