Wie kann man überprüfen, ob eine list einen anderen Wert hat

Ich habe einen Tisch wie der folgende:

(date1, date2, date3, date4, date5) 

und ich möchte überprüfen, ob irgendwelche dieser data anders als alle anderen sind. Die triviale Lösung ist:

 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 

Irgendwelche nichttrivialen Lösungen?

Wenn der Tisch einen Primärschlüssel hat, denke ich, das ist nicht trivial.

 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 

So wie beiseite, kann Ihr trivialer Fall wirklich einfach vereinfacht werden

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

Mit dem DeMorgan-Gesetz ist dies das gleiche wie

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

und dann durch die transitive Eigenschaft der Gleichheitsrelation würden wir wissen, daß, wenn das date1 gleich den anderen 4 Werten ist, dann alle 5 einander gleich sind.

Gruppe durch jeden Wert, vergleiche die gruppiert nach Zählung auf die ursprüngliche Zählung

Wenn Sie SQL server 2005+ verwenden, können Sie so etwas wie:

 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] ) 

Das war einfacher für mich, mit einem Beispiel zu sehen. Das funktioniert, aber ich bin mir nicht sicher, ob ich es überkompliziert habe.

 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