【问题标题】:SQL Query with conditional JOIN带有条件 JOIN 的 SQL 查询
【发布时间】:2010-04-13 14:13:13
【问题描述】:

场景:

表 1
CatId|名称|描述

表 2
ItId|Title|Date|CatId(外键)

我想返回 Table1 中的所有行和 Table2 中的 Title,Date,其中 从表 2 返回的必须是按日期列的最新值。 (在第二个表中有许多具有相同 CatId 的项目,我只需要最新的)

我有 2 个查询,但无法将它们合并在一起:

Query 1:  
SELECT Table1.Name,  Table1.Description,
       Table2.Title, Table2.Date
FROM 
       Table1 LEFT JOIN Table2 ON Table1.CatId=Table2.CatId

Query2:

SELECT TOP 1 Table2.Title, Table2.Date
FROM 
    Table2
WHERE 
    Table2.CatId = @inputParam
ORDER BY Table2.Date DESC

【问题讨论】:

  • 你能试着更好地解释这个问题吗?我想你是说你想从 table1 和每一行返回每一行,以及 table2 中的 Title 和 Data 列,以获得 table2 中的最新(最新数据)行,其 CatID 与 table1 中的 CatID 匹配
  • @thecoshman ,是的,没错。 Table1 中的所有行以及 Title 和 Data 值都应该来自 table2 的最新记录(具有相同的 catid)

标签: sql sql-server-2005


【解决方案1】:

您可以使用UNION,但您需要使列匹配:

好的,在重新阅读问题后,我明白你要做什么了。

这应该可以解决问题:

SELECT Table1.Name,  Table1.Description,
 T2.Title, T2.Date

FROM
 Table1

LEFT JOIN (
 SELECT CatId, Title, Date, ROW_NUMBER() over (ORDER BY CatId, Date DESC) - RANK() over (ORDER BY CatID) as Num

 FROM  Table2) T2 on T2.CatId = Table1.CatId AND T2.Num = 0

【讨论】:

  • 你为什么有 - RANK() over...,为什么需要它?
  • @mariki:这是按CatId“分组”日期。
【解决方案2】:

听起来您在谈论分组最大值(Table2 中的最新行,Table1 中的每个匹配行),在这种情况下,最简单的方法是使用 ROW_NUMBER

WITH CTE AS
(
    SELECT
        t1.Name, t1.Description, t2.Title, t2.Date,
        ROW_NUMBER() OVER (PARTITION BY t1.CatId ORDER BY t2.Date DESC) AS Seq
    FROM Table1 t1
    LEFT JOIN Table2 t2
        ON t2.CatId = t1.CatId
)
SELECT *
FROM CTE
WHERE Seq = 1
OR Date IS NULL

【讨论】:

  • in PARTITION BY t1.CatId ORDER BY t2.Date,我也可以有 t2.CatId ORDER BY t2.Date 对吧?
  • @mariki:是的,该列可能是NULL,因为它是LEFT JOIN
  • 最后一个问题,您使用 WITH..AS 有什么原因吗?为什么不简单地将 SELECT * FROM 移到顶部?
  • @mariki:您无法过滤 Seq 列(行号),除非它位于 CTE 或派生表中。
  • @Aaronaught,我的意思是我用 SELECT * FROM (...)TT 包装所有内容,然后 WHERE TT.Seq = 1 OR Date IS NULL
【解决方案3】:

这不应该工作吗?

SELECT Table1.Name,  Table1.Description,
   T2.Title, T2.Date
FROM 
   Table1 LEFT JOIN (

SELECT TOP 1 Table2.CatId Table2.Title, Table2.Date
FROM 
Table2
WHERE 
Table2.CatId = Table1.catId 
ORDER BY Table2.Date DESC

) T2 
ON Table1.CatId=T2.CatId

【讨论】:

  • 输入参数是table1返回的catId
  • 我在 = Table1.CatId 上出现错误无法绑定多部分标识符“Table1.CatId”。
猜你喜欢
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2019-12-22
  • 2013-05-13
相关资源
最近更新 更多