Avatar billede phpguru1 Nybegynder
08. oktober 2006 - 18:08 Der er 13 kommentarer

Et resultat fra sub-query

Hej E,

Jeg har følgende query:

select distinct top 5 replyId, Id from ForumThreads order by id DESC

Jeg har brug for at replyId returneres hvis != 0 og id hvis replyId = 0. Hvordan dævlan klares denne?
Avatar billede arne_v Ekspert
08. oktober 2006 - 18:17 #1
hvorfor ikke bare lave det i applikationen fremfor i SQL ?

men ellers må det være:

SELECT CASE replyid WHEN 0 THEN id ELSE replyid FROM forumthreads
Avatar billede phpguru1 Nybegynder
08. oktober 2006 - 18:20 #2
Fordi det er for tungt i applikationen. Det er en sub-query i:

SELECT * FROM ForumThreads WHERE id in (select distinct top 5 replyId, Id from ForumThreads order by id DESC) ORDER By AnswerDate

Hvordan vil du implementere dit forslag med distinct?
Avatar billede arne_v Ekspert
08. oktober 2006 - 18:25 #3
SELECT * FROM ForumThreads WHERE id IN (SELECT DISTINCT TOP 5 CASE replyid WHEN 0 THEN id ELSE replyid END AS xid FROM forumthreads ORDER BY xid)

vil jeg tro (inkl. en lille rettelse til min første kommentar)
Avatar billede phpguru1 Nybegynder
08. oktober 2006 - 18:29 #4
Tættere, udfordringen er at sorteringen i den inderste query skal være på ForumThreads.Id altid og ikke den ene eller den anden. Giver det mening?
Avatar billede tolveren Nybegynder
08. oktober 2006 - 18:38 #5
SELECT * FROM ForumThreads WHERE id IN (SELECT DISTINCT TOP 5 CASE replyid WHEN 0 THEN id ELSE replyid END AS xid FROM forumthreads ORDER BY ForumThreads.id)
slet ikke for at blande mig, men for at hjælpe måske...
Avatar billede arne_v Ekspert
08. oktober 2006 - 18:40 #6
SELECT * FROM ForumThreads WHERE id IN (
SELECT CASE replyid WHEN 0 THEN id ELSE replyid END AS xid FROM
(SELECT DISTINCT TOP 5 replyid,id FROM forumthreads ORDER BY id DESC) x
)

måske
Avatar billede janus_007 Nybegynder
09. oktober 2006 - 00:47 #7
Som udgangspunkt vil det altid kunne svare sig at undgå for mange cases i et sql-udtræk, det vil som regel altid kunne løses på en bedre måde... Og til et simpelt udtræk som dit vil jeg foreslå flg.:


SELECT * FROM ForumThreads
WHERE id in
(select distinct top 5 coalesce(nullif(replyId, 0), Id)
  from ForumThreads order by id DESC
)
ORDER By AnswerDate

Altså en simpel brug af coalesce... samme funktionalitet kunne opnås med en isnull, men coalesce er sjovere ;-)
Avatar billede phpguru1 Nybegynder
09. oktober 2006 - 21:39 #8
Hej Arne,

Den giver desværre ikke altid fem resultater.

Hej Janus

Dur desværre ikke:

ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
Avatar billede janus_007 Nybegynder
10. oktober 2006 - 00:39 #9
Nejnej... okay, det er nu ganske simpelt at løse:

SELECT * FROM ForumThreads
WHERE id in
(select distinct top 5 coalesce(nullif(replyId, 0), Id)
  from ForumThreads order by coalesce(nullif(replyId, 0), Id) DESC
)
ORDER By AnswerDate


Sådanner ;-)
Avatar billede phpguru1 Nybegynder
10. oktober 2006 - 16:40 #10
Arh, hvis du ser mit svar længere oppe:

"Tættere, udfordringen er at sorteringen i den inderste query skal være på ForumThreads.Id altid og ikke den ene eller den anden. Giver det mening?"
Avatar billede janus_007 Nybegynder
12. oktober 2006 - 00:58 #11
ja det giver mening...som jeg lige ser det så skal man lave en selfjoin på select distinct top 5 coalesce(nullif(replyId, 0), Id)
  from ForumThreads order by coalesce(nullif(replyId, 0), Id) DESC

Kan vi lave løsningen i T-Sql / SP ?
Avatar billede phpguru1 Nybegynder
22. oktober 2006 - 16:37 #12
Jeg er ikke helt med på din self-join?

En stored procedure er helt klart en mulighed!
Avatar billede phpguru1 Nybegynder
25. november 2006 - 13:53 #13
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester