使用 LEFT JOIN 获取子查询的第一行

问题描述 投票:0回答:1

我正在开发一个 SQL 查询来获取子事务的值,但我无法获得我正在寻找的结果。

我有两个提取数据的表,简化如下

表格交易

特兰尼德 身份证 价值
A-01 23
B-01 50 E
B-02 80 R
B-03 81 T

表格 交易行

创建于 身份证
23
23 50
23 80
23 81

需要的是获取二次交易第一次出现的价值。

EG

特兰尼德 CHILD_TRANID CHILD_VALUE
A-01 B-01 E

我正在使用这些 SQL 查询,但我在 SQL 语句中收到错误“Column:TRANSACTION.TRANID not found”

SELECT
    TR.TRANID,
    TRP.CHILD_TRANID,
        TRP.CHILD_VALUE
FROM
    TRANSACTION TR
    LEFT JOIN (
        SELECT
            TOP 1
            _TR.TRANID AS TRANID_FWD,
            _TR.VALUE,
            _TRC.TRANID AS TRANID_PREV
        FROM
            TRANSACTION _TR
            LEFT JOIN TRANSACTIONLINE _TL ON _TL.ID = _TR.ID
            LEFT JOIN TRANSACTION _TRC ON _TL.CREATEDFROM = _TRC.ID
        WHERE _TRC.TRANID = TR.TRANID
    ) TRP ON TRP.TRANID_PREV = TR.TRANID
WHERE
    TR.TRANID = 'A-01';

我还可以使用其他方法吗?或者我的查询有什么问题吗?

subquery odbc left-join relationship ansi-sql-92
1个回答
0
投票

为了达到预期的结果,请尝试使用 ROW_NUMBER() 对子事务进行排名并选择第一个出现的方法:

WITH RankedTransactions AS (
    SELECT 
        TR.TRANID AS TRANID_PREV,
        TRL.ID AS CHILD_ID,
        CHILD.TRANID AS CHILD_TRANID,
        CHILD.VALUE AS CHILD_VALUE,
        ROW_NUMBER() OVER (PARTITION BY TR.TRANID ORDER BY CHILD.TRANID) AS row_num
    FROM 
        TRANSACTION TR
        LEFT JOIN TRANSACTIONLINE TRL ON TR.ID = TRL.CREATEDFROM
        LEFT JOIN TRANSACTION CHILD ON TRL.ID = CHILD.ID
)
SELECT 
    TRANID_PREV AS TRANID,
    CHILD_TRANID,
    CHILD_VALUE
FROM 
    RankedTransactions
WHERE 
    TRANID_PREV = 'A-01' AND row_num = 1;
© www.soinside.com 2019 - 2024. All rights reserved.