Avatar billede zephyr Nybegynder
11. december 2001 - 23:50 Der er 18 kommentarer og
2 løsninger

noget join sjov

Hvordan er det meningen at et felt i kolonnen \'navn\' i tabellen \'test2\' skal udskrives når jeg selecter mere end én table ad gangen? altså noget lignende af det her?

SELECT test.*, test2.* FROM test, test2

Og så i mit ASP bruger jeg jo så response.write(rs(\"test.navn\")) eller sådan noget.. men kan ik få det helt til at virke? :-)
Avatar billede jakoba Nybegynder
12. december 2001 - 00:02 #1
SELECT * FROM test, test2 where test.navn = test2.navn

du får så to kolonner der hedder navn, en fra hver tabel og kan skelne mellem dem som du allerede gør.

mvh JakobA
Avatar billede tmceu Praktikant
12. december 2001 - 01:22 #2
Eller du kan bruge JOIN/INNER JOIN, som jeg mener er mere korrekt eller i det mindste mere læsbar. Der er så vidt jeg ved, ingen performance forskellem mellem jacoba\'s og mit forslag.

SELECT test.*, test2.* FROM test JOIN test2 ON test.navn=test2.navn
Avatar billede disky Nybegynder
12. december 2001 - 09:07 #3
inner join er en lille smule mere langsomt, og mere læsbart er det ikke. IMHO
Avatar billede tmceu Praktikant
12. december 2001 - 10:04 #4
disky >> opfattelsen af læsbarhed er jo heldigvis smag og behag, og vi kan hver især kun udtale os på egne vegne :-)

Jeg kan godt købe argumentet om læsbarhed når man kun joiner 2 tabeller, men jo flere tabeller man joiner jo mere læsbart mener jeg det bliver ift. jacoba\'s forslag. En anden grund til min påstand er, at man ved at bruge JOIN kun har den reelle WHERE clause i sit statement og ikke x antal kriterier til sit join

Eks. vil nedenstående efter min opfattelse være den korrekte måde at gøre det på:

SELECT *
FROM Test INNER JOIN Test2 ON Test.Navn=Test2.Navn
WHERE Test.ID > 10

fremfor

SELECT Test.* , Test2.*
FROM Test, Test2
WHERE Test.Navn=Test2.Navn AND Test.ID > 10

multiplér selv med tabeller og kriterier og jeg tror du forstår hvad jeg mener.

Og tak for oplysningen om performance forskellen, jeg troede ikke der var nogen (mærkbar ?) forskel.
Avatar billede tmceu Praktikant
12. december 2001 - 10:05 #5
Undskyld i øvrigt min ignorance, men hvad betyder \"IMHO\" ?
Avatar billede disky Nybegynder
12. december 2001 - 10:08 #6
in my humble oppinion (min mening :-)
Avatar billede tmceu Praktikant
12. december 2001 - 10:13 #7
Takker for indføringen i smarte forkortelser for dummies. Jeg føler ind i mellem at jeg er blevet for gammel til de smarte forkortelser :-)
Avatar billede jakoba Nybegynder
12. december 2001 - 10:13 #8
\"In My Humble Opinion\".
Så i er ret enige, det er en smagssag :-))

PS: Jeg troede faktisk joins var hurtigere, men foretrækker alligevel where-clausen fordi jeg synes den er mere læsbar :-))

mvh JakobA
Avatar billede disky Nybegynder
12. december 2001 - 10:17 #9
lige netop.

jeg prøvede noget hastigheds check på en kæmpe mysql database.

og join tabte hver gang.

Dog kan det ikke udelukkes at det afhænger af typen osv.


Jeg foretrækker helt klart where da jeg synes den er langt mere læseligt, specielt hved store komplexe selects\'s.

Men igen der er smag og behag
Avatar billede tmceu Praktikant
12. december 2001 - 10:30 #10
Jeg har det altså lidt lige som Christian Andersen, der ikke kan overbevise andre end sig selv om, at han er Danmarks bedste fodboldstræner :-)

Men jeg kan godt høre at ikke engang mit eksempel fra før multipliceret med 7 tabeller og 10 kriterie i WHERE clausen kan overbevise Jer, eller hvad ?
Avatar billede disky Nybegynder
12. december 2001 - 10:32 #11
Prøv at post sådanne et eksempel.
Avatar billede tmceu Praktikant
12. december 2001 - 10:43 #12
Et fiktivt eksempel

SELECT * FROM Table1
INNER JOIN Table2 ON Table1.RID = Table2.RID
INNER JOIN Table3 ON Table1.ItemGroup = Table3.ItemGroup
INNER JOIN Table4 ON Table1.Country = Table4.Country
INNER JOIN Table5 ON Table1.AreaCode = Table5.AreaCode
INNER JOIN Table6 ON Table1.SalesManID = Table6.SalesManID
INNER JOIN Table7 ON Table1.DeptID = Table7.DeptID
INNER JOIN Table8 ON Table1.TaxGroupID = Table8.TaxGroupID
WHERE Table1.SalesManID=2 AND Table1.Country=\'008\' AND Table1.ItemNumber=\'My Item\' AND BonusPct > 10 AND Table7.Region = \'Europe\'

Sammenlignet med

SELECT * FROM Table1, Table2, Table3, Table4, Table5, Table6, Table7, Table8
WHERE Table1.RID = Table2.RID AND Table1.ItemGroup = Table3.ItemGroup AND Table1.Country = Table4.Country
AND Table1.AreaCode = Table5.AreaCode AND Table1.SalesManID = Table6.SalesManID AND Table1.DeptID = Table7.DeptID
AND Table1.TaxGroupID = Table8.TaxGroupID AND Table1.SalesManID=2 AND Table1.Country=\'008\'
AND Table1.ItemNumber=\'My Item\' AND BonusPct > 10 AND Table7.Region = \'Europe\'
Avatar billede tmceu Praktikant
12. december 2001 - 10:44 #13
Den sidste kom til at stå uretfærdigt uoverskueligt, hvilket ikke var meningen. Kunne selvfølgelig godt være

SELECT * FROM Table1, Table2, Table3, Table4, Table5, Table6, Table7, Table8
WHERE Table1.RID = Table2.RID
AND Table1.ItemGroup = Table3.ItemGroup
AND Table1.Country = Table4.Country
AND Table1.AreaCode = Table5.AreaCode
AND Table1.SalesManID = Table6.SalesManID
AND Table1.DeptID = Table7.DeptID
AND Table1.TaxGroupID = Table8.TaxGroupID
AND Table1.SalesManID=2 AND Table1.Country=\'008\'
AND Table1.ItemNumber=\'My Item\' AND BonusPct > 10 AND Table7.Region = \'Europe\'
Avatar billede disky Nybegynder
12. december 2001 - 10:50 #14
yep, den nederste er lettest at læse, og mere logisk. IMHO
Avatar billede jakoba Nybegynder
12. december 2001 - 10:53 #15
Det kan nok blive svært for nogen af os at overbevise hinanden. Man vokser jo ligesom fast i \'sin måde\' at gøre tingene på.
Avatar billede disky Nybegynder
12. december 2001 - 10:54 #16
helt enig
Avatar billede tmceu Praktikant
12. december 2001 - 11:06 #17
do her, der er ingen grund til at vade mere rundt i det. Danmark er dermed blevet 3 Christian Andersen\'er \"rigere\" - håber I forstår hvad jeg mener ;-)
Avatar billede jakoba Nybegynder
12. december 2001 - 11:07 #18
Jeg ville nok skrive den som:

SELECT * FROM Table1, Table2, Table3, Table4, Table5, Table6, Table7, Table8
WHERE Table1.SalesManID=2
  AND Table1.Country=\'008\'
  AND Table1.ItemNumber=\'My Item\'
  AND BonusPct > 10
  AND Table1.DeptID = Table7.DeptID
  AND Table7.Region = \'Europe\'

  AND Table1.RID = Table2.RID
  AND Table1.ItemGroup = Table3.ItemGroup
  AND Table1.Country = Table4.Country
  AND Table1.AreaCode = Table5.AreaCode
  AND Table1.SalesManID = Table6.SalesManID
  AND Table1.TaxGroupID = Table8.TaxGroupID

så min join snarere er en slags append. dvs først begrænse udfaldsrummet og så tilføje de andre tabeller på primærnøgler

Mon ikke også det har noget med SQL-kernesn optimeringsniveau at gøre. en super SQL implementation gør det selv uanset hvordan vi skriver vores join og where clause.
Avatar billede zephyr Nybegynder
13. december 2001 - 15:19 #19
Tak for det! Så er jeg ved at have fat i det join sjov :-)

Disky, jeg ku desværre ikke give dig point for dit svar, da det ikke var helt det jeg spurgte om, men tak alligevel for dine kommentare ;)
Avatar billede disky Nybegynder
13. december 2001 - 15:32 #20
nul problemo.
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