[ Arbitar2 @ 13.02.2009. 21:20 ] @
Pozdrav,

Imam veliki problem sa sortiranjem i distinct funkcijom u MS SQL Server 2005. Naime, radi se o tome da ne mogu da sortiram kolone na osnovu dve table ako se kolona iz druge tabele ne nalazi u select statemant-u.
Na primer imam dve table 'A' i 'B'.

Sql statement koji ne radi je

Code:


      select distinct b.id from  A a , B b  where b.id = a.b_id  order by b.name;



gresku koju mi javlja je : " ORDER BY items must appear in the select list if SELECT DISTINCT is specified. "
Veoma bitna stvar je u tome da mora da mi vrati samo jednu kolonu.
Interesantna stvar je u tome da MySql podrzava ovakav 'sql statement' !?
Veoma mi je vazno da na bilo koji nacin nadjem 'workaround' u vezi ovoga.
Bilo koja ideja bi bila od velike pomoci.


[ adopilot @ 13.02.2009. 23:02 ] @

Da li ste probali da uradite

Code:

select distinct b.id from  A a , B b  where b.id = a.b_id  order by 1;


Gdije broj 1 (jedan) predstavlja redni broj koline
Čak i više kolina možete naredati naprimeejr
Code:

Order by 3,1


Ili da koristite alijas kolanoa pa kažete
Code:

select distinct b.id AS ADO from  A a , B b  where b.id = a.b_id  order by Ado


Ili da u orderu navedete ponovo kompletnu funkciju
Code:

select distinct b.id from  A a , B b  where b.id = a.b_id  order by distinct b.id;


Koliko ja znam order by se ne može koristi jao subquery možda je tu greška

ne možete reći

Code:

select * from 
(select distinct b.id from  A a , B b  where b.id = a.b_id  order by 1) as tmp1


Morate koirstii

Code:

select * from 
(select top(100)  precent distinct b.id from  A a , B b  where b.id = a.b_id  order by 1) as tmp1


Ali ovo će vam pojesti enormno preformanse

Lijep pozdrav

[ adopilot @ 13.02.2009. 23:10 ] @

U ne viđoh
Pa vi trebate složiti po koloni koja nije navedena u select.
Zašto jednostavno ne navedete u selectu i tu kolonu po kojoj hoćete da uradite sort
[ mmix @ 13.02.2009. 23:24 ] @
Ta greska je tu sa razlogom. Da ne bih izmisljao toplu vodu, baci pogleda na ovaj blog:

Code:
Letter  Value
----    -----    
A       1
A       1
B       3
B       0
C       2


Look carefully at the above, and think about what should be returned when asking for distinct Letters ordered by Value.  

The answer is .... there is no correct answer!  B contains a value of both 0 and 3, so should it appear first, or should it appear last?  The answer is -- who knows?! 
It is not specified when simply asking for distinct Letters ordered by Value.   It is not a clear, complete, deterministic question that you are asking SQL Server to
answer; it is like asking someone "what color is it when you add 4 and 3?"  -- the question makes no sense and cannot be conclusively answered as stated.


Kazes da radi pod mySQL-om, pitam se sta bi on vratio za gornji set.
[ Arbitar2 @ 14.02.2009. 20:02 ] @
Evo kako radi u MySQL:

Code:


mysql> select * from A;
+----+------+
| id | name |
+----+------+
|  1 | a1   |
|  2 | a2   |
|  3 | a3   |
|  4 | a1   |
+----+------+

mysql> select * from B;
+----+------+------+
| id | name | a_id |
+----+------+------+
|  1 | b1   |    1 |
|  2 | b2   |    2 |
|  3 | b3   |    3 |
|  4 | b1   |    1 |
+----+------+------+



i rezultat je :

Code:


mysql> SELECT distinct(a.name) FROM B as b join A as a on b.a_id = a.id order by a.id;
+------+
| name |
+------+
| a1   |
| a2   |
| a3   |
+------+



Razlog sto ne mogu da dodam jos jednu kolonu je zato sto koristim ORM Hibernate framework(hql), a koji vraca citav objekat recimo iz table :

Code:


 select  b from BusinessUnit b where  b.name like :name


Ovo je samo uproscen oblik sql(sudeci po tome da manje ljudi zna ORM Hibernate framework). Razmisljao sam ako neko moze da mi resenje u obicnom sql onda nije problem da ga prebacim u hql.Bitna je sustina.
Ukoliko bi dodao jos jedanu kolonu u select statement onda bi mi se vracao niz u nizu objekata, sto je nelogicno jer aplikacija se vec koristi i funkcije rade na MySql-u. U tom slucaju bi morao da menjam preko min 1000 redova koda sto je neizvodljivo.
Ovo mi je veoma bitno jer musterije traze da se aplikacija prebaci na MS SQL.

Hvala jos jednom.
[ retry @ 14.02.2009. 23:56 ] @
vidi dal ti ovo radi posao:
Code:

SELECT a.name FROM B as b join A as a on b.a_id = a.id group by a.name order by min(a.id)

pozdrav.