【问题标题】:Returning one row per id with inner join使用内部连接返回每个 id 一行
【发布时间】:2014-05-10 07:08:24
【问题描述】:

在 SQL Server 数据库中,我有两个表,一个是另一个的父表。子表与父表具有多对一的关系。我只需要为每个父级返回一条记录,其中包含最对应的子表记录。但是我无法弄清楚如何做到这一点。

以下是我现在的查询:

SELECT DISTINCT
    products.id,
    sku,
    name,
    mediaid
FROM
    products
INNER JOIN 
    productmedia ON products.id = productmedia.productid
WHERE
    sku IN ('HCFL 207 23 (A)','HCFL 207 22 (A)','HCFL 207 21 (A)','HCFL 207 20 (A)')
    AND productmedia.sort = 100 

我得到以下信息:

183816  HCFL 207 20 (A) HCFL SERIES- 2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 1/4", WIDE INNER RACE INSERT -ASIAN   2929082
183816  HCFL 207 20 (A) HCFL SERIES- 2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 1/4", WIDE INNER RACE INSERT -ASIAN   2929083
183817  HCFL 207 21 (A) HCFL SERIES-2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 5/16", WIDE INNER RACE INSERT-ASIAN    2929138
183817  HCFL 207 21 (A) HCFL SERIES-2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 5/16", WIDE INNER RACE INSERT-ASIAN    2929139
183818  HCFL 207 22 (A) HCFL SERIES- 2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 3/8", WIDE INNER RACE INSERT -ASIAN   2929086
183818  HCFL 207 22 (A) HCFL SERIES- 2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 3/8", WIDE INNER RACE INSERT -ASIAN   2929087
183819  HCFL 207 23 (A) HCFL SERIES- 2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 7/16", WIDE INNER RACE INSERT -ASIAN  2929084
183819  HCFL 207 23 (A) HCFL SERIES- 2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 7/16", WIDE INNER RACE INSERT -ASIAN  2929085

【问题讨论】:

  • topmost child 的定义是什么,你使用哪个 RDBMS?
  • 展示父子表的表结构...
  • 您使用哪个数据库服务器(和版本)?不同的数据库引擎可能有不同的解决方案。
  • 请显示预期输出
  • 这是 SQL 数据库版本 2008 R2

标签: sql select join sql-server-2008-r2 distinct


【解决方案1】:

CROSS APPLY是你的朋友:

SELECT DISTINCT
    products.id,
    sku,
    name,
    mediaid
FROM
    products
    CROSS APPLY (
        SELECT TOP(1)
            * -- List the required columns!
        FROM
            productmedia
        WHERE           
            products.id = productmedia.productid
            AND productmedia.sort = 100 
        ORDER BY
            YourOrderColumn -- Change it to your required order!
    ) AS X
WHERE
    sku IN ('HCFL 207 23 (A)','HCFL 207 22 (A)','HCFL 207 21 (A)','HCFL 207 20 (A)')

【讨论】:

  • 如果您希望在输出(结果)中包含该列,那么您应该将其添加到 botch 选择中。如果您不想显示它,您可以从两个选择中跳过它。我们无法猜测哪些列来自哪个表,因为您没有提到表结构并且您的查询不清楚。提示:如果您在查询中使用两个或多个表,请为它们添加别名并始终在列名中包含该别名。
【解决方案2】:
;with cte as(
select s.id studentId, s.name, c.class, 
ROW_NUMBER() over(partition by class order by s.id) rn 
from Student s
inner join class c on s.classId = c.id
)
select * from cte where rn = 1

您可以将“order by s.id”更改为您认为对结果进行排序的任何其他列。

【讨论】:

    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多