提问者:小点点

将SQL联接表简化为另一个


我是新手。我有以下两张桌子。一张专辑:

另一个是歌曲:

所以所有这些歌曲都属于“自由”专辑。在api调用中,我使用dapper显示所有相册,这很好。

[HttpGet("[action]/{id}")]
        public async Task<IActionResult> GetSingleAlbumViaDapper(int id)
        {
            var sql = "SELECT * FROM Albums WHERE Id = @AlbumId";
            var album = (await _dbDapper.QueryAsync<Album>(sql, new { AlbumId = id })).SingleOrDefault();
        }

结果如下:

但是我想加入这张专辑的相关歌曲。我试过以下方法,但不起作用,你知道为什么吗?

[HttpGet("[action]/{id}")]
        public async Task<IActionResult> GetSingleAlbumViaDapper(int id)
        {
            var sql = "SELECT * FROM Albums WHERE Id = @AlbumId JOIN Songs in Songs on Albums.Songs";
            var album = (await _dbDapper.QueryAsync<Album>(sql, new { AlbumId = id })).SingleOrDefault();
        }

它只是说:关键字'JOIN'附近的语法不正确。


共3个答案

匿名用户

如何联接表时出错。首先连接,然后筛选(其中部分)

正确的查询应该是这样的

SELECT * 
  FROM Albums a
  JOIN Songs s 
    ON s.AlbumId = a.Id
 WHERE a.Id = @AlbumId;

UPD。因为您只在第二个查询中查找歌曲,所以从您的表scema我看到这里不需要join。您已将album.id传递给查询。试试这个,告诉我结果

SELECT * 
  FROM Songs s 
 WHERE s.AlbumId = @AlbumId;

匿名用户

尝试更改连接查询如下:

SELECT a.* FROM Albums as a inner join Songs as s on s.AlbumId = a.Id WHERE a.Id = @AlbumId

匿名用户

您需要使用Dapper的连接语法。我假设你有一个歌曲类,我还假设你的相册构造函数创建了歌曲列表。然后你会像下面这样做,告诉衣冠楚楚的人期待专辑和歌曲,并返回一张专辑。数据应该从歌曲的id上拆分,这就是拆分参数的作用。这是从内存中键入的,缺少信息,所以可能需要一些调整。

var sql = "SELECT * FROM Albums AS a INNER JOIN Songs AS s ON s.AlbumId = a.Id WHERE a.Id = @AlbumId";
Album foundAlbum = null;
var album = (await _dbDapper.QueryAsync<Album, Song, Album>(sql, (album, song) => 
    {
        if (foundAlbum is null)
        {
            foundAlbum = album;
        }
        foundAlbum.Songs.Add(song);
        return album;
    }, splitOn : "Id", new { AlbumId = id })).SingleOrDefault();
// Use foundAlbum here....