Avatar billede alexander_j Nybegynder
24. juni 2007 - 17:01 Der er 13 kommentarer og
2 løsninger

Tom database påvirker og giver fejl

SELECT tab1.id FROM tab1 , tab2

Ovenstående SQL-sætning giver ingen resultater og jeg har fundet ud af at det skyldes at tabellen 'tab2' er tom.
Det er nødvendigt at tab2 står der, da jeg i en anden sammenhæng har behov for at udvide SQL-sætningen, så den tager forbehold for bestemte elementer i 'tab2'.
Jeg forstår bare ikke hvor det at 'tab2' står der skulle gå ind og blokere ovenstående, da den jo ikke rigtig har noget med SQL-kaldet at gøre.

Er der en der kan hjælpe?
Avatar billede arne_v Ekspert
24. juni 2007 - 17:07 #1
Den sætning matcher alle rækker i tab1 med alle rækker i tab2.

Hvis tab1 har 5 rækker og tab2 har 3 rækker bliver der 15 rækker i output

5 * 3 = 15

Hvis der er 0 rækker i tab2 kan du selv gange ...
Avatar billede arne_v Ekspert
24. juni 2007 - 17:07 #2
Jeg tror at du skal have en join betingelse på og ved at lave det til en
left join kan du muligvis få det du ønsker.
Avatar billede barklund Nybegynder
24. juni 2007 - 17:09 #3
Du bør virkelig finde en introduktionsbog til sql, for ovenstående er ret centralt for at forstå, hvordan sql virker. Hvis den tab1 indeholder 10 og tab2 0 rækker, så giver ovenstående 0 rækker - da 10*0 rækker løbes igennem. Og hvis tab1 indeholder 10 og tab2 indeholder 100 rækker, så giver resultatet 1000 rækker, da der er 10*100 rækker i det, du udvælger.

vil du join'e de to tabeller og kun udvælge, hvor bestemte ting fra den ene matcher bestemte ting fra den anden, så skal du fx bruge INNER JOIN eller LEFT JOIN alt efter, hvad du ønsker.
Avatar billede alexander_j Nybegynder
24. juni 2007 - 18:17 #4
Sikke en hård tone Barky, men jeg kan jo tage det (snøft snøft).

SELECT DISTINCT( rooms.id ) , rooms.subid , rooms.label FROM rooms , in_room , in_group WHERE rooms.owner='2' OR ( in_room.userid='2' AND in_room.roomid=rooms.id ) OR ( in_group.userid='2' AND in_group.groupid=in_room.groupid AND in_room.roomid=rooms.id )

^^det her er min samlede SQL-sætning.
Nogen der kan fortælle hvad jeg skal lege med inner, outer, left eller right JOIN - og måske endda forklare forskellen på disse?
Avatar billede arne_v Ekspert
24. juni 2007 - 19:00 #5
Avatar billede alexander_j Nybegynder
24. juni 2007 - 19:23 #6
Uha synes det er lidt volapyk - kunne du selv sætte et par ord på hver type?
Avatar billede alexander_j Nybegynder
24. juni 2007 - 19:26 #7
Måske jeg i mit eksempel burde bruge UNION?
Avatar billede barklund Nybegynder
24. juni 2007 - 19:52 #8
Ikke nogen hård tone, men du bør finde en introduktionsbog - det er der ingen skam i :)

Og din query er meget spøjs, men det er nok en konsekvens af en spøjs databasestruktur.

Prøv uden at skrive et eneste ord sql at forklare, hvordan dine tabeller hænger sammen og hvilket udtræk du forventer i denne situation.
Avatar billede alexander_j Nybegynder
24. juni 2007 - 20:09 #9
Jeg har tre tabeller der hedder
rooms - denne indeholder en række rum samt den egentlige ejer af rummet.
in_room - denne indeholder en liste over de brugere eller grupper der er medlem af de forskellige rum.
in_group - denne indeholder en liste over de brugere der er medlem af en given gruppe.

I rummet kan der altså være tilknyttet en ejer, brugere eller en hel brugergruppe.

Jeg ønsker at lave en SQL-sætning der henter rum(rooms.id) som brugeren er tilknyttet enten ved, at de er ejere af rummet (rooms.owner) eller at de er tilknyttet rummet som brugere (in_room.userid) eller er tilknyttet en gruppe som er tilknyttet rummet(in_group.userid/in_room.groupid).

Er det rigtige ikke SQL ord jeg har brugt?
Avatar billede alexander_j Nybegynder
24. juni 2007 - 20:21 #10
SELECT rooms.id , rooms.subid , rooms.label FROM rooms WHERE rooms.owner='2' UNION SELECT rooms.id , rooms.subid , rooms.label FROM rooms , in_room WHERE in_room.roomid=rooms.id AND in_room.userid='2' UNION SELECT rooms.id , rooms.subid , rooms.label FROM rooms , in_room , in_group WHERE in_room.roomid=rooms.id AND in_room.groupid=in_group.groupid AND in_group.userid='2'

UNION ser ud til at være den fornuftige løsning, så kom bare med svar begge to.

Ville dog stadig gerne have en menneskelig forklaring på inner, outer osv. JOIN.
Avatar billede barklund Nybegynder
24. juni 2007 - 20:38 #11
Et svar :)
Avatar billede arne_v Ekspert
25. juni 2007 - 00:07 #12
svar
Avatar billede arne_v Ekspert
25. juni 2007 - 00:07 #13
Avatar billede barklund Nybegynder
25. juni 2007 - 19:53 #14
Taktak :)
Avatar billede alexander_j Nybegynder
25. juni 2007 - 20:12 #15
Selv tak.

Arne -> har ikke læst den artikel, men har sidenhen fundet:
http://www.w3schools.com/sql/sql_join.asp
http://activedeveloper.dk/articles/323/
Som også kort berøre emnet.
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