我有两个这样的表:
Clients
ID | Name | DOB | etc...
1 | Andy | 26/12/90 |
2 | Bob | 27/10/93 |
3 | Callum | 11/12/97 |
4 | Dave | 06/01/64 |
5 | Andy | 01/06/89 |
ClientRecordEntries
ID | cID | DateSaved | Address | Phone Number | Blah blah blah...
1 | 1 | 06/03/13 03:01 | 1 High Street | 0754812374 |
2 | 1 | 06/03/13 04:05 | 1 High Street | 0854123474 |
3 | 5 | 06/03/13 04:23 | 742 Evergreen Terrace | 0548162384 |
4 | 4 | 06/03/13 03:27 | 5 Spooner St | 0512348455 |
5 | 3 | 06/03/13 05:03 | 6 Cromwell Avenue | 0745289324 |
6 | 5 | 06/03/13 05:04 | 743 Evergreen Terrace | 0548162384 |
7 | 5 | 06/03/13 05:17 | 743 Evergreen Terrace | 0461238489 |
8 | 2 | 06/03/13 05:18 | 45 High Street | 0682374988 |
这个想法是关于每个客户端的一些基本的、不可变的信息存储在第一个表中,更详细的信息存储在第二个表中。当客户的数据被编辑时,而不是编辑他们在 ClientRecordEntries 中的相应行,会添加一个全新的行(带有时间戳),以便记录所有先前所做的更改。因此,每个客户端的当前信息是第二个表中与其 ID 对应并具有最新时间戳的行。
例如,ID 为 5 的客户住在 743 Evergreen Terrace,他的电话号码是 0461238489,他的详细信息已被编辑两次(因此总共输入了 3 次 - 第二个表格的第 3、6 和 7 行。)
我的问题是,如何将第一个表的查询结果与第二个表连接,但删除除每个客户端的最新信息之外的所有行?例如,在上面的示例中,我想为每个名为“Andy”的人选择当前信息,所以我想要结果:
Name | DOB | Address | Phone Number | etc...
Andy | 26/12/90 | 1 High Street | 0854123474 |
Andy | 01/06/89 | 743 Evergreen Terrace | 0461238489 |
我猜我想要一些类似的东西SELECT * FROM Clients JOIN ClientRecordEntries ON Clients.ID=ClientRecordEntries.cID WHERE Name='Andy'...
,然后使用一些东西,MAX(SavedDate)
但我被卡住了。有什么建议么?
(是的,我意识到SELECT *
会显示比我上面输入的更多的列,但我正在简化事情。)
如果它有所作为,我正在使用 SQL Server。