11. december 2001 - 23:50Der 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? :-)
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
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.
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\'
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\'
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 ;-)
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.
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.