sql - 仅在三个表中连接一行

标签 sql sql-server

(我的问题已经被问了很多次,涉及两个表,并且已经回答了 hereherehere 。但是我不知道如何对涉及的三个表做同样的事情.)

我有三个表,A、B 和 C,其中 A 有很多 B,B 有很多 C。我想连接这些表并为每个 A 选择零行或一行,哪一行应该基于 C 中的条件.

例如,假设:

SELECT
     a.aId
    ,b.bId
    ,c.cId
FROM
    a
    INNER JOIN b ON b.aId=a.aId
    INNER JOIN c ON c.bId=b.bId
WHERE
    c.someColumn='foo'

...产生以下结果:

aId   bId   cId
===   ===   ===
1     11    101
1     12    102
1     12    103
2     21    201
2     21    203
2     22    202

...然后我想,例如,检索两个不同的 A 行,即具有最高 cId 的行。

aId   bId   cId
===   ===   ===
1     12    103
2     21    203

最佳答案

您可以使用 ROW_NUMBER:

WITH Cte AS (
    SELECT
        a.aId,
        b.bId,
        c.cId,
        rn = ROW_NUMBER() OVER (PARTITION BY a.aId ORDER BY c.cId DESC)
    FROM a
    INNER JOIN b
        ON b.aId = a.aId
    INNER JOIN c
        ON c.bId = b.bId
    WHERE c.someColumn = 'foo'
)
SELECT
    aId, bId, cId
FROM Cte
WHERE rn = 1

关于sql - 仅在三个表中连接一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37314945/

相关文章:

php - SQL bool 关系

mysql - 无法使用 group by 在 sql 中合并两个查询

c# - 如何在C#中使用SqlTransaction

sql - 如何使用 SQL Server 中的 View 检查可用库存并将其分配给订单

java - 在 MS SQL Server 2012 中通过 Java 动态创建存储过程

sql - 插入后 SQL 代码中的西里尔符号不正确

SQL开始时间结束时间查询

java - 按整数或 boolean 值过滤的数据库性能?

mysql - SQL - 替换 SELECT 子句中的值

php - 在 Woocommerce 中使用 SQL 从特定产品属性值获取产品 ID