Fråga om join med koppling många-till-många

Permalänk
Medlem

Fråga om join med koppling många-till-många

Hej! Det finns en exempeldatabas Chinook Exempeldatabas Chinook.

För att hämta alla album som är jazz eller blues kan man skriva:

Select DISTINCT Title, Genre.Name From Track Inner Join Genre ON Genre.GenreId = Track.GenreId Inner Join Album On Track.AlbumId = Album.AlbumId Where Genre.Name = 'Jazz' OR Genre.Name = 'Blues';

Jag är lärare på en kurs där en elev skrev detta.

select Album.Title, Genre.Name from Album inner join Genre on Genre.Name = 'Blues' OR Genre.Name = 'Jazz'

Det ger resultat men jag är osäker på varför. Tabellerna har ju inte ens direkt koppling.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem

Den väljer ut alla i Genre som har 'Blues' eller 'Jazz' och kör en cross join med Album.

Om du kollar antalet i Album så är det 347 rader x 2 i Genre = 694 rader vilket är precis vad en cross join skulle ge.

Resultatet är ju felaktigt men det är anledningen att du får ett resultat.

Det här ger samma resultat också:

SELECT Album.Title, Genre.Name
FROM Album, Genre
WHERE Genre.Name = 'Blues' OR Genre.Name = 'Jazz'

Permalänk
Medlem
Skrivet av kyuw:

Den väljer ut alla i Genre som har 'Blues' eller 'Jazz' och kör en cross join med Album.

Om du kollar antalet i Album så är det 347 rader x 2 i Genre = 694 rader vilket är precis vad en cross join skulle ge.

Resultatet är ju felaktigt men det är anledningen att du får ett resultat.

Det här ger samma resultat också:

SELECT Album.Title, Genre.Name
FROM Album, Genre
WHERE Genre.Name = 'Blues' OR Genre.Name = 'Jazz'

Ok, då fattar jag.

Tack!

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem

Dessa två ger samma resultat men det krävs en distinct på den ena men inte den andra.

Varför?

select Genre.Name, Album.Title from Genre inner join Track on Genre.GenreId = Track.GenreId inner join Album on Track.AlbumId = Album.AlbumId where Genre.Name = 'Jazz' or Genre.Name = 'blues' Group by Genre.Name, Album.Title ------------------------------------------------- Select DISTINCT Title, Genre.Name From Track Inner Join Genre ON Genre.GenreId = Track.GenreId Inner Join Album On Track.AlbumId = Album.AlbumId Where Genre.Name = 'Jazz' OR Genre.Name = 'Blues';

Listade själv ut att det är p.g.a. Group By. Så denna ger unika värden också?

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem
Skrivet av Larsp777:

Dessa två ger samma resultat men det krävs en distinct på den ena men inte den andra.

Varför?

select Genre.Name, Album.Title from Genre inner join Track on Genre.GenreId = Track.GenreId inner join Album on Track.AlbumId = Album.AlbumId where Genre.Name = 'Jazz' or Genre.Name = 'blues' Group by Genre.Name, Album.Title ------------------------------------------------- Select DISTINCT Title, Genre.Name From Track Inner Join Genre ON Genre.GenreId = Track.GenreId Inner Join Album On Track.AlbumId = Album.AlbumId Where Genre.Name = 'Jazz' OR Genre.Name = 'Blues';

Listade själv ut att det är p.g.a. Group By. Så denna ger unika värden också?

Group By är ju att gruppera på värdet i fältet och en gruppering är ju per definition unik.

Om du kör utan group by får du lika många resultat som det finns låtar i varje album, men du väljer ut namn på album som ju blir samma för alla låtar eftersom de tillhör det albumet.

Warner 25 Anos Jazz
Warner 25 Anos Jazz
Warner 25 Anos Jazz
....etc
Unplugged Blues
Unplugged Blues
Unplugged Blues
...etc

Så den gör alltså en gruppering först på Genre.Name, alltså sorterar in allt i en grupp som heter Jazz och en grupp som heter Blues och sedan gör den en gruppering på Album.Title på allting den redan grupperat. Så den skapar grupper för alla album titlar och sorterar in allt i de grupperna. Slutligen väljer du ut Album.Title och Genre.Name från de grupperna vilket alltså blir unikt för att den grupperat allt efter Genre.Name och Album.Title

Kanske inte så bra förklarat. Om du tänker dig mappar och den stämplar genre och title på mapparna och sedan sorterar in allt där, det du får ut från frågan är det som står på mapparna, inte det som sorterats in i mapparna.

Permalänk
Medlem
Skrivet av kyuw:

Group By är ju att gruppera på värdet i fältet och en gruppering är ju per definition unik.

Om du kör utan group by får du lika många resultat som det finns låtar i varje album, men du väljer ut namn på album som ju blir samma för alla låtar eftersom de tillhör det albumet.

Warner 25 Anos Jazz
Warner 25 Anos Jazz
Warner 25 Anos Jazz
....etc
Unplugged Blues
Unplugged Blues
Unplugged Blues
...etc

Så den gör alltså en gruppering först på Genre.Name, alltså sorterar in allt i en grupp som heter Jazz och en grupp som heter Blues och sedan gör den en gruppering på Album.Title på allting den redan grupperat. Så den skapar grupper för alla album titlar och sorterar in allt i de grupperna. Slutligen väljer du ut Album.Title och Genre.Name från de grupperna vilket alltså blir unikt för att den grupperat allt efter Genre.Name och Album.Title

Kanske inte så bra förklarat. Om du tänker dig mappar och den stämplar genre och title på mapparna och sedan sorterar in allt där, det du får ut från frågan är det som står på mapparna, inte det som sorterats in i mapparna.

Ok, jag fattar, tack!

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10