2016-11-07 10 views
1

Ich versuche, eine Abfrage, die Aufruf alle erhalten, die col3 = 1 übereinstimmen und den Rest der Gruppe col4 = 123 bekommen, während col2 der eindeutige Wert sein wird. Mein Tisch sieht aus wieJoin bestimmten Zeilen zu den Ergebnissen

ID col1 col2 col3 col4 
--------------------------------- 
1 A1  A  NULL 123 
2 B1  B  NULL 123 
3 C1  C  NULL 123 
4 D1  D  NULL 123 
5 C2  C  1  123 
6 D2  D  1  123 

und ich versuche, eine Abfrage zu machen, die IDs 1,2,5 und 6. Die Gewerkschaften haben versucht, und schließt sich aus Variationen von select * from tbl where col4 = 123 and col3 =1 zurückkehren würde und sie alle entweder ausschließen 3,4,5 , 6 oder schließe sie alle ein.

+0

Ich verstehe nicht, die Frage . Welche Kriterien möchten Sie zum Auswählen von Zeilen verwenden? – Blorgbeard

+0

Ich möchte grundsätzlich für col4 = 123 abfragen und dann alles, was einen Wert in Spalte 3 hat und alle anderen Werte, die col2 nicht entsprechen. – user2920788

Antwort

2
select  * 


from  (select  * 

         ,row_number() over 
         (
          partition by col2 
          order by  case when col3 = 1 then 1 else 2 end 
         ) as rn 

      from  t 

      where  col4 = 123 
      ) t 

where  col3 = 1 
     or t.rn = 1 
; 
0

Wenn ich richtig verstehe, wollen Sie alle Zeilen, in denen col3 nicht NULL ist und dann von den übrigen Reihen, jene, die unterschiedliche col2 Werte von denen haben:

select t.* 
from t 
where t.col4 = 123 and 
     (t.col3 is not null or 
     t.col2 not in (select t.col2 from t t2 where t2.col4 = 123 and t2.col3 is not null) 
    ) 
+0

Vergessen Sie nicht die Anforderung "col4 = 123" –

+0

@AlvinThompson. . . Vielen Dank. –

+0

Ich denke, die Anforderung "123" sollte nur für den zweiten Teil gelten (wenn t.col3 null ist) –

Verwandte Themen