sql - 当比表 A 中的记录更新时,查询从表 B 返回值

标签 sql tsql select sql-server-2005

我有一张表,上面有成员(member)的姓名、地址等,还有上次更新记录的时间戳。我有第二个表,用于保存对成员记录的更新,一个保存表,直到工作人员批准更改。

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

我尝试了一些东西,例如 UNIONTop 1 但不太正确。我可以创建一个复杂的 CASE 语句,但它会执行得很好吗?

听起来很简单,从表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_last/birth_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 

最佳答案

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

--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.

关于sql - 当比表 A 中的记录更新时,查询从表 B 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32700613/

相关文章:

php - INSERT 和 UPDATE 语句将错误数据传递到数据库

SQL Server动态PIVOT查询?

php - 为什么查询会产生此错误 : mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in storagelog.php on line 24

mysql - 为这个 MySQL 查询寻找最佳索引

sql - 递归表 SQL 上的 View 级别号

java - 用于 Java 应用程序的 Transact-SQL 嵌入式数据库

SQL Server : how to combine two select queries from the same table and take the result on Column

mysql - SQL 中 SELECT 查询的优先级

mysql - 使用变量为 mysql 中的分组制作标签

php - 使用php将sql中的数据导出到excel