Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 distinct   Vladimir Tsibulsky   05 Apr 2001 14:07:52 
 Re: distinct   Ilya Zvyagin   05 Apr 2001 17:47:53 
 distinct   Vladimir Tsibulsky   06 Apr 2001 07:49:36 
 Re: distinct   Ilya Zvyagin   06 Apr 2001 16:24:36 
 Re: distinct   Alexandr Drobot   06 Apr 2001 17:36:08 
 Re: distinct   Ilya Zvyagin   06 Apr 2001 19:32:42 
 Re: distinct   Alexandr Drobot   06 Apr 2001 22:09:56 
 Re: distinct   Anatoly Moskovsky   07 Apr 2001 19:21:43 
 distinct   Sergey Ignatov   17 Apr 2001 07:25:13 
 Re: distinct   Ilya Zvyagin   17 Apr 2001 20:07:53 
 Re: distinct   Dmitry Novikov   17 Apr 2001 20:24:10 
 distinct   Ivan Frolcov   05 Apr 2001 16:44:01 
 distinct   Vladimir Tsibulsky   06 Apr 2001 07:56:06 
 distinct   Ivan Frolcov   06 Apr 2001 12:11:38 
 Re: distinct   Ilya Zvyagin   06 Apr 2001 16:26:39 
 Re: distinct   Ivan Frolcov   06 Apr 2001 17:01:21 
 Re: distinct   Ilya Zvyagin   06 Apr 2001 19:30:39 
Архивное /su.dbms.sql/44957db9c489.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional