当比 Table A 中的记录更新时,查询 table B 中的 return 值
Query to return values from table B when newer than record in Table A
我有一个 table,其中包含成员的姓名、地址等,以及上次更新记录的时间戳。我有第二个 table 保存成员记录的更新,一个持有 table,直到工作人员批准更改。
我查询 return 成员 table 的数据。我现在需要检查更新 table,如果成员在更新 table 中的记录具有更新的时间戳,return 该记录而不是成员 [=35] 中的记录=].
我尝试了一些方法,例如 UNION
和 Top 1
,但不太正确。我可以做一个复杂的 CASE
声明,但它会表现良好吗?
听起来很简单,从table A 获取最新记录,从table B 获取最新记录,return 获取最新的一条记录。
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,但都不太正确。这是一个有效的查询并且 return 是预期的结果,但是请注意我必须传递 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
联合方法是个好主意,但您希望使用 row_number()
window 函数而不仅仅是 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
这是一个简单的查询,可以帮助您 return 最近的记录:
--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 的稍后时间戳,如果有的话。否则,您可以使用 member
table.
中每个 ID 的最新时间戳
我有一个 table,其中包含成员的姓名、地址等,以及上次更新记录的时间戳。我有第二个 table 保存成员记录的更新,一个持有 table,直到工作人员批准更改。
我查询 return 成员 table 的数据。我现在需要检查更新 table,如果成员在更新 table 中的记录具有更新的时间戳,return 该记录而不是成员 [=35] 中的记录=].
我尝试了一些方法,例如 UNION
和 Top 1
,但不太正确。我可以做一个复杂的 CASE
声明,但它会表现良好吗?
听起来很简单,从table A 获取最新记录,从table B 获取最新记录,return 获取最新的一条记录。
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,但都不太正确。这是一个有效的查询并且 return 是预期的结果,但是请注意我必须传递 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
联合方法是个好主意,但您希望使用 row_number()
window 函数而不仅仅是 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
这是一个简单的查询,可以帮助您 return 最近的记录:
--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 的稍后时间戳,如果有的话。否则,您可以使用 member
table.