【问题标题】:Join one table with only 1 first matching record加入只有 1 个第一条匹配记录的表
【发布时间】:2017-12-04 15:05:15
【问题描述】:
--------------------Table1-------------
Table1Id            item      SaleId       Dimensions
1                   test1      41           10*11*12
2                   test2      41           13*14*15

--------------------Table2-------------
Table2Id     item         Description   
1           test1         Test element1 desc 1
2           test1         Test element1 desc 2
3           test2         Test element2 desc 1
4           Test2         Test element2 desc 2

目前我正在使用以下查询。

select Table1.Table1Id, Table1.item, Table1.Dimensions, Table2.Description
on Table1.item = Table2.item
where Table1.SaleId = 41

但我想要这样的结果(需要将 Table1.item 与 Table2 中的项目的第一条记录一起加入)

Result :
Table1Id            item            Dimensions       Description
1                   test1           10*11*12          Test element1 desc 1
2                   test2           13*14*15          Test element2 desc 1

【问题讨论】:

  • 请不要使用不适用于您的问题的标签。我删除了数据库标签,因为不清楚您实际使用的是哪一个。请添加only你实际使用的数据库的标签
  • 指定的查询无效,因为它没有 FROM 子句。
  • 您所描述的是一个非常普遍的问题。您的联接返回多行。你必须决定你想要哪一行。您声明您想要“第一”行,但您必须以某种方式决定首先定义什么。它可以是像 MIN 或 MAX 这样的聚合。或者您可以使用 ROW_NUMBER 和 order by。
  • 基于Table2.id升序。

标签: sql


【解决方案1】:

处理此问题的最典型方法是使用 ANSI 标准 row_number()

Select t1.Table1Id, t1.item, t1.Dimensions, t2.Description
from table1 t1 join
     (select t2.*, row_number() over (partition by t2.item order by t2.table2id desc) as seqnum
      from table2 t2
     ) t
     on t1.item = t2.item and t2.seqnum = 1
where t1.SaleId = 41;

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多