|
|
su.dbms.sql- SU.DBMS.SQL ------------------------------------------------------------------ From : Anatoly Moskovsky 2:5020/400 07 Apr 2001 19:21:43 To : All Subject : Re: distinct -------------------------------------------------------------------------------- Привет! "Alexandr Drobot" <shd@host.svit.kiev.ua> wrote in message news:9al0ok$i6i$1@host.talk.ru... >>> Как можно получить список отбрасываемых записей distinct? > CREATE TABLE _T2 ( > [k] [int] > PRIMARY KEY CLUSTERED, > [p1] [int] NULL , > [p2] [int] NULL , > [p3] [int] NULL > ) > insert _T2 (k,p1,p2,p3) select 1, 1,1,1 > insert _T2 (k,p1,p2,p3) select 2, 2,2,2 > insert _T2 (k,p1,p2,p3) select 3, 3,3,3 > insert _T2 (k,p1,p2,p3) select 4, 3,3,3 > insert _T2 (k,p1,p2,p3) select 5, 4,4,4 > insert _T2 (k,p1,p2,p3) select 6, 5,5,5 > insert _T2 (k,p1,p2,p3) select 7, 5,5,5 > insert _T2 (k,p1,p2,p3) select 8, 6,6,6 > insert _T2 (k,p1,p2,p3) select 9, 3,3,3 > select distinct p1,p2,p3, count(p1) as n from _T2 > group by p1,p2,p3 > having count(p1)>1 > > > p1 p2 p3 n > ----------- ----------- ----------- ----------- > 3 3 3 3 > 5 5 5 2 > > А вот значения k из этой таблицы (_T2) получить > действительно невозможно :( > > Теория не позволяет :) Как раз если в таблице есть ПК(простой или составной) то с помощью стандартного SQL можно сделать это: select p1,p2,p3 from t where (k, p1,p2,p3) not in ( select min(k),p1,p2,p3 from t group by p1,p2,p3 ); где "k" - выражение, составленное из полей ключа, в простейшем случае - одно поле, для составного ключа, например 3 числовых такое: (k1*(k2max+1)+k2)*(k3max+1)+ k3 или lpad(k1,40)||lpad(k2,40)||lpad(k3,40) ("||" - конкатенация строк) Если же в таблице ПК нет(только поля p1,p2,p3),что странно, то надо в запросе искусственно пронумеровать записи, или использовать внутреннюю адресацию записи в сервере: 1. Hумерация записей (Оракл): select p1,p2,p3 from ( select rownum r, p1,p2,p3 from ( select p1,p2,p3 from t order by 1,2,3) ) where (r, p1,p2,p3) not in ( select min(r),p1,p2,p3 from ( select rownum r, p1,p2,p3 from ( select p1,p2,p3 from t order by 1,2,3) ) group by p1,p2,p3 ); Здесь "Order by" использован для однозначности при нумерации. 2. Испол ьзование внутреннего ID записи (Оракл): select p1,p2,p3 from t where (rowid, p1,p2,p3) not in ( select min(rowid),p1,p2,p3 from t group by p1,p2,p3 ); Бай --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /su.dbms.sql/44957db9c489.html, оценка из 5, голосов 10
|