SQL Server:使用最新条目查询更新记录

时间:2016-04-06 09:18:41

标签: sql sql-server

我有一张表,记录了雇主和雇员的记录。数据。像这样的东西

EmployerName  EmployerPhone EmployerAddress  EmployeeName  EmployeePhone  EmployeeAddress   Date  
-------------------------------------------------------------------------------------------------------
John              12345        NewYork         Harry        59786            NewYork        12-1-1991
Mac               22345        Bankok          John         12345            Delhi          12-3-1991
Smith             54732        Arab            Amar         59226            China          21-6-1991
Sarah             12345        Bhutan          Mac          22345            NewYork        5-9-1991
Root              85674        NewYork         Smith        54732            Japan          2-11-1991

我有另一张表,它将在phone number(雇主和雇员)的基础上拥有通用记录。

表结构如下

Phone Name Address

我想根据according to dateTable1的最新记录Table2放到phone

喜欢这个

Phone  Name    Address
-----------------------
59786  Harry  NewYork
22345  Mac    NewYork
59226  Amar   China
12345  Sarah  Bhutan
22345  Mac    NewYork
85674  Root   NewYork
54732  Smith  Arab 

我写了很多查询,但无法找到按要求生成的任何人。

任何形式的帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

初始化没有电话重复的表:

   INSERT IGNORE INTO Table2 (Phone, Name, Address)
       SELECT X.* FROM (
            SELECT EmployeeName,EmployeePhone,EmployeeAddress FROM Table1             
            UNION
            SELECT EmployerName,EmployerPhone,EmployerAddress FROM Table1
           ) X
             WHERE NOT EXISTS (SELECT Phone FROM Table2 WHERE Phone=X.Phone)

答案 1 :(得分:1)

如果我理解你的问题,我认为这就是你要找的。应该为一次性工作

DECLARE @restbl TABLE
(
    Name            varchar(100),
    Phone           varchar(20),
    Addr            varchar(100),
    [Date]          date,
    RecType         varchar(100)
)
INSERT INTO @restbl
SELECT  EmployerName, EmployerPhone, NULL, MAX([Date]), 'Employer'
FROM    @tbl
GROUP BY EmployerName, EmployerPhone

INSERT INTO @restbl
SELECT  EmployeeName, EmployeePhone, NULL, MAX([Date]), 'Employee'
FROM    @tbl
GROUP BY EmployeeName, EmployeePhone;

WITH    LatestData (Name, Phone, [Date])
        AS
        (
            SELECT  Name, Phone, MAX([Date])
            FROM    @restbl
            GROUP BY Name, Phone
        )
INSERT INTO FinalTable (Name, Phone, [Address])
SELECT  DISTINCT ld.Name, ld.Phone, ISNULL(tEmployer.EmployerAddress, tEmployee.EmployeeAddress) AS [Address]
FROM    LatestData ld
        LEFT JOIN @tbl tEmployer ON ld.Name = tEmployer.EmployerName AND ld.Phone = tEmployer.EmployerPhone AND ld.Date = tEmployer.Date
        LEFT JOIN @tbl tEmployee ON ld.Name = tEmployee.EmployeeName AND ld.Phone = tEmployee.EmployeePhone AND ld.Date = tEmployee.Date