当前位置: 首页 > 知识库问答 >
问题:

将SQL联接表简化为另一个

宗政和韵
2023-03-14

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

另一个是歌曲:

所以所有这些歌曲都属于“自由”专辑。在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个答案

公羊新
2023-03-14

您需要使用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....
马泰
2023-03-14

尝试更改连接查询如下:

SELECT a.* FROM Albums as a inner join Songs as s on s.AlbumId = a.Id WHERE a.Id = @AlbumId
傅鸿波
2023-03-14

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

正确的查询应该是这样的

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;
 类似资料:
  • 问题内容: 如果我尝试以下示例查询: 我收到错误消息: 我正在使用SQL-Server 2008 R2 Express,它以兼容级别100运行。 问题答案: 给他们一个别名,然后在中使用别名,或使用方括号。下面混合了两种可能性。

  • 问题内容: 如何将一个表中的一行连接到具有另一表上给定列的MAX值的行? 例如,我有一张桌子和一张桌子。我想以表中该拍卖的最高出价(即列AND的最高值,其中= )加入拍卖表。 问题答案: 这很烦人。您最好在每个获胜的Auction_bid中都带有一个“优胜者”标志。 请注意,竞标价为零的竞标价将根本不会列出,而有关联的竞标(会发生这种情况)将为每个并列竞标出现一次。

  • 问题内容: 我有三个表:R,S和P。 表R通过外键与S连接;有 应该 是S中至少一个的记录,所以我可以加入: 如果S中没有记录,那么我没有行,那很好。 然后表S与P联接,其中记录为P可能存在,也可能不存在,并与S联接。 所以我做 如果我想将第二个JOIN绑定到S而不是R,例如我可以使用括号,该怎么办: 还是这已经是R,S和P之间笛卡尔积的自然行为? 问题答案: 各种外部联接和普通联接都在相同的优先

  • 问题内容: 谁能告诉我如何编写查询并如上所述获取结果,谢谢!我试过加入,左右加入。一切都没有结果。 问题答案: 您可以在这两个表之间写左外部联接最好的理解方法是检查下图 查询您的要求 阅读有关 代码项目的 原始文章将对您有很大帮助:SQL Joins的可视表示 。 在以下位置找到原始版本:MySQL中的JOIN和OUTER JOIN之间的区别 。

  • 问题内容: 我有3个表t1,t2,t3。我想要基于以下条件的结果集:t1在t2上具有外部联接(t1的所有行),t1在t3上具有外部联接(t1的所有行),而t2在t3上具有外部联接(t2的所有行)。如何在单个查询中使用这些外部3个联接?基本上我想将t- sql格式的查询转换为ANSI格式。原始查询是这样的 我设法使用前2个联接作为 这对于前两个条件正常工作。但是无法合并第3个联接。任何人都可以提出一

  • 问题内容: 因为显然每个人都讨厌子选择,所以我想使用联接来做到这一点。 举一个令人难以置信的示例,拿两个表,一个表的列表是1-6的数字,而另一个表的列表是偶数的0-8。然后,我的目标是在表格Nums中输出所有奇数。 如果我只想获取Nums中的偶数列表,我会… 但是,如何使用这些表来获取Nums表中的非偶数列表?或者,换句话说,像… 问题答案: 正确使用SubSELECT可以很好…单独的“某人不喜欢