我有一个第三方表,其中填充了一些杂乱的数据,我需要从中获取最新的不同记录。每年或每次“Person”更改时,都会为该表提供一个新行。该表的工作基于最近的 ActiveDate 是正确的人。我创建了一个模拟表和数据来显示这一点。
CREATE TABLE `Persons` (
`PersonId` varchar(200) NOT NULL,
`Name` varchar(200) NOT NULL DEFAULT '',
`ActiveDate` varchar(25) NOT NULL,
`ExpireDate` varchar(25) DEFAULT NULL,
`Job` varchar(200) NOT NULL DEFAULT '',
`Position` varchar(200) NOT NULL DEFAULT ''
)
还有一些模拟数据:
Id |`Name` |ActiveDate |ExpireDate |Job |`Position`
---------------------------------------------------------------------------------------------------
J1234 |Doe, John |2010-08-15 00:00:00 |2011-08-15 00:00:00 |Worker |Janitor
J1234 |Doe, John |2011-08-15 00:00:00 |0000-00-00 00:00:00 |Worker |Janitor
777 |Doe, Jane |2010-06-04 00:00:00 |0000-00-00 00:00:00 |Boss |Janitor
777 |Doe, Jane |2011-04-30 00:00:00 |0000-00-00 00:00:00 |Boss |Janitor
654G |Smith, Jane |2011-01-20 00:00:00 |0000-00-00 00:00:00 |Worker |Janitor
该表还具有由最终用户实际设置的 ExpireDate 列,并不总是让我感到沮丧。目前我正在使用一个虚拟表将不同的记录拉出来并存储一天。我会使用临时表,但我不是 100% 确定如何在 MySQL 中使用,而且我不喜欢它们。我这样做的方式只是暂时的,希望获得更好的 SQL。
然后必须将数据与许多其他表连接才能获得最终产品。但是我仍然需要处理最初的一组不同的数据。从一开始就加入另一张桌子是行不通的。
所以这就是我如何提取数据、存储它,然后稍后再提取它并将其连接到其他表:
INSERT INTO tmp_Person (Id, `Name`, Job, `Position`)
SELECT DISTINCT Id, `Name`, Job, `Position`
FROM Person
SELECT tmp_Person.Id,
tmp_Person.`Name`,
tmp_Person.Job,
tmp_Person.`Position`,
Pricing.Cost,
Pricing.Benefit
FROM tmp_Person
LEFT OUTER JOIN Pricing AS CL ON CL.PersonId = tmp_Person.Id
AND CL.PriceScredule = 'Major-Client'
AND CL.ExpireDate = '0000-00-00 00:00:00'
LEFT OUTER JOIN Pricing AS Inter ON Inter.PersonId = tmp_Person.Id
AND Inter.PriceScredule = 'Internal-Client'
AND Inter.ExpireDate = '0000-00-00 00:00:00'
我怎样才能写这个来避免使用临时表(以任何形式)处理重复行的成本?希望我已经说得很清楚了,如果不是,我可以很高兴地补充或澄清。