sqlite SQL左连接-要修复的错误查询

pftdvrlh  于 12个月前  发布在  SQLite
关注(0)|答案(1)|浏览(127)

我得到了附加的练习,但它给出的结果是错误的。(我不知道正确的结果是什么。)ON子句后有错误,但我不知道是什么。
练习和数据库列:(https://i.stack.imgur.com/xy3uJ.png
我的错误查询:

SELECT artists.name, title, unitprice
FROM albums, artists
left join tracks 
ON artists.artistid = albums.artistid and albums.albumid = tracks.albumid
where artists.name = "Audioslave";
oxf4rvwz

oxf4rvwz1#

我相信你想要:

SELECT title,tracks.name, unitprice 
FROM albums 
LEFT JOIN artists ON artists.artistid = albums.artistid 
LEFT JOIN tracks ON albums.albumid = tracks.albumid 
WHERE artists.name = 'Audioslave';
  • 注意到tracks.name并没有被要求,但确实有助于澄清。
  • 由于WHERE子句,艺术家的名字将全部相同。
  • Albums表是核心表,您可以将Artists表和Tracks表加入其中
  • p.s.注意在文字值周围使用单引号(Audioslave)(双引号将导致列未找到错误)

结果包括(不是所有40行):

....
另一种选择,如果问题是问每张专辑的单价总和,可以是:

SELECT title, sum(unitprice) FROM albums LEFT JOIN artists ON artists.artistid = albums.artistid LEFT JOIN tracks ON albums.albumid = tracks.albumid WHERE artists.name = 'Audioslave' GROUP BY albums.albumid;
  • sum是一个聚合函数,作用于一个组。
  • 默认情况下,提取的所有行都是一个组。然而,使用GROUP BY子句为每个专辑创建一个GROUP(因为每个专辑都是唯一的)。
  • 包含曲目的名称会引起混淆,因为它是其中一个名称(根据查询优化器确定的顺序任意)。

第二个查询的结果将是:

  • 您可以使用sum(unitprice) AS unitprice来更好地命名输出列。

你可以走极端,做这样的事情:

SELECT 
    title, 
    sum(unitprice) AS albumprice, 
    count(unitprice) AS Tracks, 
    avg(unitprice) AS AVGPrice, 
    group_concat(tracks.name,', ') AS tracklist  
FROM albums 
LEFT JOIN artists ON artists.artistid = albums.artistid 
LEFT JOIN tracks ON albums.albumid = tracks.albumid 
WHERE artists.name = 'Audioslave' 
GROUP BY albums.albumid
;
  • 即使用更多的聚合函数(count,avg和group_concat)

在这种情况下,结果将是(注意不是所有的轨道显示):-

  • 注意,如果一个列名是unqiue,那么你不需要在列名之前使用表名后跟.
  • Tracks表和Artists表都有一个列调用名,因此使用后跟.的表名可以解决歧义,而UnitPrice对于Tracks表是唯一的。

相关问题