[SQL] Hoe een SELECT IN optioneel maken???

Pagina: 1
Acties:

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Momenteel ben ik een beetje aan het stoeien met een query en heb al gekeken naar een oplossing met OUTER/LEFT/RIGHT joins, maar dat ging niet lukken.

Ik heb nu gekozen voor een SELECT IN oplossing en dat gaat redelijk goed, maar het gaat fout bij de TOPICS welke geen REPLY hebben.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SELECT TOP 50 T.TOPIC_ID, 
          T.T_SUBJECT, 
          T.FORUM_ID, 
          F.F_ABBREVIATION, 
          T.T_DATE, 
          T.T_LAST_POST, 
          M.M_NAME, 
          T.T_AUTHOR, 
          T.T_REPLIES, 
          M1.M_NAME AS REPLIER, 
          T.T_LAST_POST_AUTHOR, 
          R.REPLY_ID

FROM        MEMBERS AS M, 
          TOPICS AS T, 
          FORUM AS F, 
          REPLY AS R, 
          MEMBERS AS M1

WHERE      T.T_LAST_POST_AUTHOR = M1.MEMBER_ID 
          AND T.FORUM_ID = F.FORUM_ID 
          AND M.MEMBER_ID = T.T_AUTHOR 
          AND  R.REPLY_ID IN (SELECT MAX(REPLY_ID)
                        FROM REPLY
                        WHERE TOPIC_ID = T.TOPIC_ID)

ORDER BY T.T_LAST_POST DESC;

Weet iemand van jullie hoe ik ervoor kan zorgen dat ik in dit geval gewoon alle topics gedisplayed kan krijgen :? Het is namelijk zo dat er ook topics bestaan welke nog geen reply hebben (of nooit een reply krijgen ;) )

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

code:
1
or not exists (select 'dummy' from replies where topic=topic)

zoiets :)
edit:

Dat gaat nog niet goed omdat je reply ook joint in de hoofdquery :o
Tip: de beste oplossing is het redundant opslaan van deze gegevens bij het topic.

Who is John Galt?


Verwijderd

OR NOT queries zorgen voor een inmense performance dip. Dus t.a.t. niet gebruiken

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Gezien ik nu nog een erg kleine database heb (testomgeving) wilde ik die OR NOT EXISTS even uitproberen, maar weet totaal niet waar ik deze moet neerzetten :?

Als ik deze nu in de plaast van se SELECT IN doe, krijg ik als resultaat de lijst met alle topics en replies. Dus 1 en hetzelfde topic komt nu wel 10 keer voor.

Het zou natuurlijk gewoon mooi zijn geweest als ik:
code:
1
WHERE REPLY_ID OPTIONAL IN (SELECT ...)

kon doen, dan was het meteen opgelost :P

Verwijderd

Kent die database van jou ook inner joins? indien ja, los het daarmee op.

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Op woensdag 08 mei 2002 10:34 schreef Otis het volgende:
Kent die database van jou ook inner joins? indien ja, los het daarmee op.
Ja, dat kan die database denk ik wel. Heb niet zo heel veel ervaring met databases in MS Access, maar ik ga er wel even naar kijken.

  • Kama
  • Registratie: Mei 2002
  • Laatst online: 03-09 09:19

Kama

Aritifical Intelligenticus

Je kunt proberen het ding eerst naar integers te converteren zodat de null's gewoon 0 worden:

...IN INT(SELECT ... )

SQL Server slikt dit niet maar MS Access wel (afaik)

Niels


  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Op woensdag 08 mei 2002 11:40 schreef Kama het volgende:
Je kunt proberen het ding eerst naar integers te converteren zodat de null's gewoon 0 worden:

...IN INT(SELECT ... )

SQL Server slikt dit niet maar MS Access wel (afaik)
Dat los je in sqlserver zo op:

ISNULL(price, 0) AS Price

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Persoonlijk zou ik een iets ander DB model hebben gekozen. Een startpost is eigenlijk ook gewoon een reactie en zou dus ook in de reactie tabel moeten komen. Op die manier heeft een topic dus altijd en reactie. Daarnaast heb je dan alle in topics getikte tekst in 1 tabel staan wat weer makkelijk is om bijvoorbeeld een searchengine te implementeren.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Janoz:
Persoonlijk zou ik een iets ander DB model hebben gekozen. Een startpost is eigenlijk ook gewoon een reactie en zou dus ook in de reactie tabel moeten komen. Op die manier heeft een topic dus altijd en reactie. Daarnaast heb je dan alle in topics getikte tekst in 1 tabel staan wat weer makkelijk is om bijvoorbeeld een searchengine te implementeren.
Janoz, je hebt helemaal gelijk :) Helaas is het zo dat ik het moet doen met het gegeven datamodel :( Het is niet anders en dus moet ik het oplossen dmv zo'n fantastische query....

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Het ziet ernaar uit dat ik een oplossing heb! In het eerste bericht was ik vergeten te melden dat er in de TOPICS tabel ook nog een veld REPLIES aanwezig was. Dit was ik helemaal vergeten |:(

Nu heb ik er het volgende van gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
SELECT TOP 50 T.TOPIC_ID, 
          T.T_SUBJECT, 
          T.FORUM_ID, 
          F.F_ABBREVIATION, 
          T.T_DATE, 
          T.T_LAST_POST, 
          M.M_NAME, 
          T.T_AUTHOR, 
          T.T_REPLIES, 
          M1.M_NAME AS REPLIER, 
          T.T_LAST_POST_AUTHOR, 
          R.REPLY_ID
FROM        MEMBERS AS M, 
          TOPICS AS T, 
          FORUM AS F, 
          REPLY AS R, 
          MEMBERS AS M1

WHERE      T.T_LAST_POST_AUTHOR = M1.MEMBER_ID 
          AND T.FORUM_ID = F.FORUM_ID 
          AND M.MEMBER_ID = T.T_AUTHOR 
          AND  R.REPLY_ID IN (SELECT MAX(REPLY_ID)
                        FROM REPLY
                        WHERE TOPIC_ID = T.TOPIC_ID)

ORDER BY T.T_LAST_POST DESC

UNION

SELECT TOP 50 T.TOPIC_ID, 
          T.T_SUBJECT, 
          T.FORUM_ID, 
          F.F_ABBREVIATION, 
          T.T_DATE, 
          T.T_LAST_POST, 
          M.M_NAME, 
          T.T_AUTHOR, 
          T.T_REPLIES, 
          M1.M_NAME AS REPLIER, 
          T.T_LAST_POST_AUTHOR, 
          0
FROM        MEMBERS AS M, 
          TOPICS AS T, 
          FORUM AS F, 
          MEMBERS AS M1

WHERE      T.T_LAST_POST_AUTHOR = M1.MEMBER_ID 
          AND T.FORUM_ID = F.FORUM_ID 
          AND M.MEMBER_ID = T.T_AUTHOR 
          AND T.REPLIES = 0

ORDER BY T.T_LAST_POST DESC
;

De query wordt zo wel gruwelijk onoverzichtelijk :( Maar het geeft wel het gewenste resultaat.

Mocht het nog eenvoudiger kunnen dan hoor ik dat natuurlijk graag :)
Pagina: 1