2014-12-12 14 views
5

ich eine Auswahlabfrage habenDistinct nach mehreren Spalten zu vergleichen SQL

Select col1,col2,col3 
from table; 

Die Tabelle enthält folgende Zeilen

col1 col2 col3 
A | B | C 
B | A | C 
C | B | C 

Ich brauche das deutliche Ergebnis zu erhalten, die eine einzige Kombination A, B enthält, C durch den Vergleich mehrerer Spalten.

Ergebnis sollte soetwas wie

col1 col2 col3 
A | B | C 

die Reihenfolge der Ergebniszeilen kann geändert werden.

Wie kann ich das erreichen?

+3

die es RDBMS Oracle/MySQL/SqlServe? –

Antwort

0
SELECT * 
FROM table 
WHERE (col1 = 'A' AND col2 = 'B' AND col3 = 'C') 
+0

OP möchte doppelte Zeilen nach allen drei Spalten entfernen, aber die Reihenfolge sollte keine Rolle spielen. Sie filtern nach statischen Werten, aber abgesehen davon, dass es nur ein Beispiel war, ist es auch falsch, weil 'col3 = 'A' AND col1 = 'B' UND col2 = 'C'' ebenfalls erlaubt wären. –

+0

Ja, die Werte der Spalten sind nicht statisch! – Praveen

+2

Können Sie bitte eine Erklärung zu Ihrer Antwort hinzufügen? –

2

Bitte versuchen Sie dies, ich bin mir nicht sicher über Sie richtige Anforderung. Aber auf Beispieldaten oben gegeben. Ich habe kam in dieser Lösung,

With CTE as 
(
    Select MIN(col1) as col1 from MyTable 
) 
Select * from CTE 
cross apply 
    (
     Select MIN(col2) as col2 from MyTable 
     where col2 <> CTE.col1 
    )as a 
cross apply 
    (
     Select MIN(col3) as col3 from MyTable 
     where col3 not in (CTE.col1,a.col2) 
    )as b 

DEMO HERE

0

Sie können auch mit diesem unter Abfrage gehen, wenn die Anzahl der Spalte und die Werte bekannt sind.

The CASE statement is the closest to IF in SQL 

SELECT 
     CASE 
       WHEN (col1 = 'A' and col2 = 'B' and col3='C') or (col1 = 'C' and col2 = 'A' and col3='B') or (col1 = 'B' and col2 = 'C' and col3='A') 
       THEN 1 
       ELSE 0 
     END as RESULT, * 
FROM table 

Aus dem Ergebnis Sie die gewünschte Ausgabe von RESULT==1(integer) durch Prüfen der Wert annehmen kann

Wenn Sie die result as a boolean value wollen tun dann die CAST wie

SELECT 
    CAST(
     CASE 
       WHEN (col1 = 'A' and col2 = 'B' and col3='C') or (col1 = 'C' and col2 = 'A' and col3='B') or (col1 = 'B' and col2 = 'C' and col3='A') 
       THEN 1 
       ELSE 0 
     END as RESULT_INT) 
    as RESUTL, * 
FROM table 
Verwandte Themen