Sql 查询以在比表A中的记录更新时从表B返回值

Sql 查询以在比表A中的记录更新时从表B返回值,sql,tsql,select,sql-server-2005,Sql,Tsql,Select,Sql Server 2005,我有一个表,上面有一个成员的姓名、地址等,还有上次更新记录的时间戳。我有第二个表,保存对成员记录的更新,这是一个保留表,直到员工批准更改 我有一个从成员表返回数据的查询。现在,我需要检查updates表,如果updates表中的成员记录具有较新的时间戳,则返回该记录,而不是成员表中的记录 我尝试了一些方法,比如与Top 1建立一个UNION,但并不完全正确。我可以做一个复杂的案例陈述,但这样做效果好吗 听起来很简单,从表A中获取最新的记录,从表B中获取最新的记录,并返回一条最新的记录 SELEC

我有一个表,上面有一个成员的姓名、地址等,还有上次更新记录的时间戳。我有第二个表,保存对成员记录的更新,这是一个保留表,直到员工批准更改

我有一个从成员表返回数据的查询。现在,我需要检查updates表,如果updates表中的成员记录具有较新的时间戳,则返回该记录,而不是成员表中的记录

我尝试了一些方法,比如与
Top 1
建立一个
UNION
,但并不完全正确。我可以做一个复杂的
案例
陈述,但这样做效果好吗

听起来很简单,从表A中获取最新的记录,从表B中获取最新的记录,并返回一条最新的记录

SELECT name, address, city, state, zipcode, time_stamp
FROM Member
WHERE ID = 123

SELECT name, address, city, state, zipcode, time_stamp
FROM MemberUpdates
WHERE ID = 123
编辑:

好的,在目前的帮助下,我能够得到我期望的结果。然后,我去添加额外的where子句,我打破了它。尝试了几种不同的方法,包括使用CTE,但没有完全正确。这是一个可以运行并返回预期结果的查询,但是请注意,我必须两次传递name\u last/birth\u year/memNum。有更好的办法吗

SELECT TOP 1 m.abn,
            m.aliases,
            m.birth_year,
            m.user_stamp, 

            q.updatePending,
            q.name_first,
            q.name_last,
            q.company,
            q.address1,
            q.mailing_address,
            q.city,
            q.state,
            q.zipcode,
            q.email_address

FROM (
                        SELECT  TOP 1   
                            1 AS updatePending, 
                            a.entity_number,
                            a.name_first,
                            a.name_last,
                            NULLIF(LTRIM(RTRIM(
                            LTRIM(RTRIM(ISNULL(a.company, ''))) +
                            LTRIM(RTRIM(ISNULL(a.firm_name, ''))))),'') AS company,
                            a.address1,
                            a.mailing_address,
                            a.city,
                            a.state,
                            a.zip_code AS zipcode,
                            a.internet_address AS email_address,
                            a.time_stamp
            FROM        statebar.dbo.STAGING_Address_Change_Request a
                INNER JOIN Member m ON m.entity_number = a.entity_number
            WHERE       a.entity_number = (
    SELECT m.entity_number
    FROM Member m
        INNER JOIN  Named_Entity ne ON  (ne.entity_number = m.entity_number)
    WHERE   ne.name_last = 'jones'
        AND m.birth_year = '1975'
        AND m.memNum = '12345'
        )
                AND a.time_stamp > m.time_stamp

            UNION ALL

            SELECT TOP 1 
                    0 AS updatePending,
                    ne.entity_number,
                    ne.name_first,
                    ne.name_last,
                    NULLIF(LTRIM(RTRIM(
                    LTRIM(RTRIM(ISNULL(ne.company, ''))) +
                    LTRIM(RTRIM(ISNULL(ne.firm_name, ''))))),'') AS company,
                    ne.address1,
                    ne.mailing_address,
                    ne.city,
                    ne.state,
                    ne.zip_code,
                    ne.internet_address AS email_address,
                    m.time_stamp
            FROM    Member m
                INNER JOIN  Named_Entity ne ON  (ne.entity_number = m.entity_number)
                LEFT JOIN   statebar.dbo.STAGING_Address_Change_Request a ON a.entity_number = m.entity_number
            WHERE   ne.entity_number = (
                                        SELECT m.entity_number
                                        FROM Member m
                                            INNER JOIN  Named_Entity ne ON  (ne.entity_number = m.entity_number)
                                        WHERE   ne.name_last = 'jones'
                                            AND m.birth_year = '1975'
                                            AND m.memNum = '12345'
                                            )
                AND m.time_stamp > a.time_stamp
            ORDER BY updatePending DESC, a.time_stamp DESC) q
    INNER JOIN Member m on m.entity_number = q.entity_number

ORDER BY q.time_stamp DESC 

联合方法是一个好主意,但您希望使用
行数()
窗口函数,而不仅仅是top。另外,可以使用
union all
代替
union
。您不关心
A
B
之间的重复,而
union all
只会执行得更好:

SELECT name, address, city, state, zipcode, time_stamp
FROM   (SELECT name, address, city, state, zipcode, time_stamp, 
               ROW_NUMBER() OVER (PARTITION BY name ORDER BY time_stamp DESC) rn
        FROM   (SELECT name, address, city, state, zipcode, time_stamp
                FROM   Member
                UNION ALL
                SELECT name, address, city, state, zipcode, time_stamp
                FROM   MemberUpdates) t
        ) q
WHERE   rn = 1

下面是一个简单的查询,可以帮助您返回最新的记录:

--Only selects the top row with the most recent record
SELECT TOP 1 * FROM record
(
    --Select rows with the same ID
    SELECT name, address, city, state, zipcode, time_stamp
    FROM Member
    WHERE ID = 123
    UNION ALL
    SELECT name, address, city, state, zipcode, time_stamp
    FROM MemberUpdates
    WHERE ID = 123
) t
ORDER BY t.time_stamp DESC --Order the table by time_stamp to get the most recent record
-- DESC is used because datetime is ordered by oldest first in ascending order.
考虑:

SELECT
    id,
    MAX(CASE WHEN u.mx_ts IS NULL THEN m.mx_ts ELSE u.mx_ts end)
FROM 
    (SELECT 
        id, 
        MAX(time_stamp) AS mx_ts 
    FROM 
        MEMBER 
    GROUP BY 
        id) m
    LEFT OUTER JOIN
    (SELECT 
        id, 
        MAX(time_stamp) AS mx_ts 
    FROM 
        MemberUpdates 
    GROUP BY 
        id) u ON
    m.id = u.id AND
    u.mx_ts > m.mx_ts
GROUP BY 
    id

如果有时间戳,这将加入
memberupdates
中每个id的后续时间戳。否则,您可以使用
成员表中每个id的最新时间戳。

这只适用于1个成员。如果您有更多的成员,则只能获得1个成员的最新记录。@JodyT我知道,但只要
ID
列是唯一的,并且您只需要特定成员的最新记录,那么这就足够了:)。如果我们删除ID条件检查,则“是”,这将只返回表上任何最近记录的1个结果,因为
TOP 1
。您的查询看起来无法正确编译,因为
左侧外部联接
上的
)u之间有一个额外的“')”。另外,对于
CASE
语句,您没有
END
。您应该重新编写查询,以便它能够正确编译,并解释为什么此解决方案适用于Connie。