【问题标题】:Join data from two tables and top from table 2连接来自两个表的数据和来自表 2 的顶部
【发布时间】:2014-02-05 17:45:34
【问题描述】:

我有这张桌子:

表1:

id   Name
1   Example1
2   Example2

表2:

id  Date..............
1   5.2.2014........
1   6.2.2014.........
1   6.2.2014........
2   16.1.2014.......
2   17.1.2014.......

我需要从 table1 获取 id 和 Name 并加入 table1.id = table2.id 并且从 table2 只获取前 1 行... 示例:

id    Name         Date
1     Example1   5.2.2014
2     Example2   16.1.2014

有可能吗?

【问题讨论】:

  • 哪个 DBMS .. MSSQL or Mysql , oracle etc ??
  • 也定义“顶行”。 SQL 中的表实际上并没有任何固有的顺序(索引本质上是优化细节),因此如果您不使用 ORDER BY 子句,您会以未定义的顺序返回行。看起来您需要一个简单的 MIN() 聚合,正如一些答案所显示的那样 - 您的表中的数据是否支持这种简单的查询,还是我们需要更多的参与?

标签: sql


【解决方案1】:

您可以使用row_number() 过滤除id 的最新行以外的所有行:

select  *
from    (
        select  row_number() over (partition by id order by Date desc) as rn
        ,       *
        from    Table2
        ) as t2
join    Table1 as t1
on      t1.id = t2.id
where   t2.rn = 1 -- Only latest row

【讨论】:

  • 结果只是这样:1 Example1 5.2.2014 ......我需要所有结果:1 Example1 5.2.2014 和 2 Example2 16.1.2014
  • 糟糕,我忘记了partition by 子句。再试一次!
  • 现在我有这个: 1 Example1 5.2.2014 1 Example1 5.2.2014 1 Example1 5.2.2014 和 2 Example2 16.1.2014 2 Example2 16.1.2014 ......但我只需要来自 table1 的 1 条 id 记录...
  • 这很奇怪...如果您可以在SQL Fiddle 重现问题,我可以再看看。
【解决方案2】:

嗯,一个简单的尝试是

SELECT  t1.*,
        (SELECT TOP 1 t2.Date FROM Table2 t2 WHERE t2.ID = t1.ID t2.Date) t2Date
FROM    Table1 t1

如果您使用的是 SQL Server,则可以使用 ROW_NUMBER

类似

;WITH Vals AS (
            SELECT  t1.ID,
                    t1.Name,
                    t2.Date,
                    ROW_NUMBER() OVER(PARTITION BY t1.ID ORDER BY t2.Date) RowID
            FROm    Table1 t1 LEFT JOIN
                    Table2 t2   ON  t1.ID
    )
    SELECT  *
    FROM    Vals
    WHERE   RowID = 1

【讨论】:

  • 可以吗? : 选择 t1.*,
  • 应该没问题,但大多数人会建议指定实际的列名而不是使用*
【解决方案3】:
Select t1.id, t1.name , MIN(t2.date)
From table1 t1
Inner Join table2 t2
 On t1.id=t2.id
Group By t1.id, t1.name

【讨论】:

  • 请有人解释一下这个解决方案的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多