Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅加入SQL Server 2008中的最新记录?_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

如何仅加入SQL Server 2008中的最新记录?

如何仅加入SQL Server 2008中的最新记录?,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有两个表A和B。表A可以为每个用户提供多条记录。对于表A中的每一行,表B可以有多条记录 以下是一个例子: Table A Table B a_id a_key b_id b_key b_AtblID 1. 6678 5778 1. 6509 5778 6678 2. 6679 5778 2. 6508 5778 6678 3. 650

我有两个表A和B。表A可以为每个用户提供多条记录。对于表A中的每一行,表B可以有多条记录

以下是一个例子:

    Table A                 Table B
   a_id   a_key        b_id   b_key  b_AtblID
1. 6678   5778      1. 6509    5778    6678
2. 6679   5778      2. 6508    5778    6678
                    3. 6507    5778    6679
                    4. 6505    5778    6679
                    5. 6490    5778    6678
您可以在一个表中看到2条记录。一条记录在B表中有3条记录,一条记录在B表中有2条记录

我希望我的查询从表A中提取记录,从表B中提取最近的记录。我不需要表B中与表A中的记录匹配的每一条记录,如果这样做有意义的话。下面是我的代码从表B中提取所有记录的示例:

SELECT *
FROM A
     LEFT OUTER JOIN B
        ON b_AtblID = (
            SELECT TOP 1 b_AtblID
            FROM B 
            WHERE b_AtblID = a_id
            ORDER BY b_id DESC
        )

我希望我的代码对于表A中的每一行只返回一条记录,但我从表B中获得了所有记录。如果有人可以帮助,请告诉我。谢谢。

您可以使用
行号

WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY b_AtblID ORDER BY b_id DESC)
    FROM dbo.TableB
)
SELECT *
FROM dbo.TableA a
INNER JOIN CTE b
    ON a.a_id = b.b_AtblID
    AND b.RN = 1
;
或交叉应用:

SELECT *
FROM dbo.TableA a
CROSS APPLY (SELECT TOP 1 *
             FROM dbo.TableB
             WHERE b_AtblID = a.a_id
             ORDER BY b_id DESC) b;

您可以使用
行编号

WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY b_AtblID ORDER BY b_id DESC)
    FROM dbo.TableB
)
SELECT *
FROM dbo.TableA a
INNER JOIN CTE b
    ON a.a_id = b.b_AtblID
    AND b.RN = 1
;
或交叉应用:

SELECT *
FROM dbo.TableA a
CROSS APPLY (SELECT TOP 1 *
             FROM dbo.TableB
             WHERE b_AtblID = a.a_id
             ORDER BY b_id DESC) b;


我在这里看到的最大问题是,这两个表之间存在多对多关系。这带来了很多挑战。如果它使用桥接表来管理这种关系,那就更好了。您能修复设计吗?b_id是b表的主键。我无法更改我的表结构。这是一个我必须维护的旧系统…你对最近记录的标准是什么
max
b_id
?我感觉到你的痛苦。你最好的选择是使用下面拉马克的答案。因为我没有任何其他字段,所以只需要拉最高的b_id。Create date存在,但如果在同一日期创建多个记录,则它们可以相同。我在这里看到的最大问题是,这两个表之间存在多对多关系。这带来了很多挑战。如果它使用桥接表来管理这种关系,那就更好了。您能修复设计吗?b_id是b表的主键。我无法更改我的表结构。这是一个我必须维护的旧系统…你对最近记录的标准是什么
max
b_id
?我感觉到你的痛苦。你最好的选择是使用下面拉马克的答案。因为我没有任何其他字段,所以只需要拉最高的b_id。创建日期存在,但如果在同一日期创建多条记录,则它们可以相同。我认为您需要扩展窗口函数:
ROW\u NUMBER()(按b\u键划分,b\u AbtlID按b\u id排序)
@Tyron78正如我理解的问题,我看不出有什么必要,我尝试了交叉应用解决方案,但在“;”附近不断出现错误,语法不正确@浓缩咖啡我漏掉了派生表别名,试试看now@espresso_coffee这就是为什么我发布了不止一种方法,所以你可以测试哪种方法更适合你我认为你需要扩展窗口函数:
ROW\u NUMBER()(按b\u键划分,按b\u id排序)
@Tyron78正如我理解的问题,我看不出有什么必要,我尝试了交叉应用解决方案,但在“;”附近不断出现错误,语法不正确@浓缩咖啡我漏掉了派生表别名,试试看now@espresso_coffee这就是为什么我发布了不止一种方法,所以你可以测试哪一种更适合你