2016-07-07 6 views
5

आधारित कर्मचारी शीर्षक अपडेट कर रहा है मैं 2 टेबल हैएसक्यूएल पर सबसे हाल की स्थान

select * from #Table1 
+------------+-------+---------------------+ 
| EMPLOYEEID | Name | Title    | 
+--------------------+---------------------+ 
| 1   | Tom | System Admin  | 
| 2   | Bill | Server Admin  | 
| 3   | John | Senior Server Admin | 
| 4   | Bob | IT Staff   | 
| 5   | Jill | Senior IT Staff  | 
+--------------------+---------------------+ 

तालिका 2

CREATE TABLE #Table2(
    EMPLOYEEnumber [nvarchar] (100) NULL, 
    Name [nvarchar] (100) NULL, 
    positiontitle [nvarchar] (100) NULL, 
    datepositionstart [date] NOT NULL) 

    INSERT INTO #Table2 (EMPLOYEEnumber, Name, positiontitle, datepositionstart) VALUES ('1','Tom','System Admin', '2014-07-03'), ('1','Tom','Server Admin', '2014-08-13'), ('1','Tom','Senior Server Admin', '2016-07-23'), ('2', 'Bob', 'IT Staff', '2014-07-03') , ('2', 'Bob', 'Senior IT Staff', '2016-10-15') 

जो मुझे देता है:

select * from #Table2 
    +----------------+-------+---------------------+-----------------+ 
    | EMPLOYEEnumber | Name | positiontitle  |datepositionstart| 
    +----------------+-------+--------------------+-----------------+ 
    | 1    | Tom | System Admin  | 2014-07-03  | 
    | 2    | Tom | Server Admin  | 2014-08-13  | 
    | 3    | Tom | Senior Server Admin | 2016-07-23  | 
    | 4    | Bob | IT Staff   | 2014-07-03  | 
    | 4    | Bob | Senior IT Staff  | 2016-10-15  | 
    +------------------------+---------------------+-----------------+ 

तालिका 2 में सबसे हाल की स्थिति के आधार पर मैं तालिका 1 कर्मचारी शीर्षक कैसे अपडेट करूं?

नीचे दिए गए कोड को सबसे हालिया तारीख नहीं मिलती है, इसके बजाय मुझे तालिका 2 से कर्मचारियों की डुप्लिकेट उसी डेटपॉजिस्टार्ट के साथ मिलती है।

UPDATE Table1 
    SET E.TITLE = hre.[PositionTitle] 
    FROM Table1 E 
    JOIN Table2 hre on hre.EmployeeNumber = E.EMPLOYEEID 
    WHERE 
     E.Name = hre.Name 
     AND datepositionstart = 
      (SELECT MAX(datepositionstart) 
       FROM table2 hre 
       WHERE hre.EmployeeNumber = E.EMPLOYEEID) 

अपेक्षित परिणाम:

+------------+-------+---------------------+ 
| EMPLOYEEID | Name | Title    | 
+--------------------+---------------------+ 
| 1   | Tom | Senior Server Admin | 
| 2   | Bill | Server Admin  | 
| 3   | John | Senior Server Admin | 
| 4   | Bob | Senior IT Staff  | 
| 5   | Jill | Senior IT Staff  | 
+--------------------+---------------------+ 
+0

काश सभी एसक्यूएल प्रश्नों इस प्रकार फ़ॉर्मेट किया गया था! आपने इसके लिए अपना अपवर्त अर्जित किया। –

+0

हां, तालिका 2 में आपका डेटा गलत प्रतीत होता है ... –

+1

नहीं, ऐसा मत करो। इसके बजाय एक दृश्य बनाएँ। (या, शायद, एक गणना कॉलम है।) लेकिन डेटा असंगतता को खतरे में डालकर, एक ही डेटा को दो बार स्टोर क्यों करें? – jarlh

उत्तर

4

उपयोग row_number():।

update 
    set title = t2.positiontitle 
from table1 t1 join 
    (select t2.*, row_number() over (partition by employeenumber order by datepositionstart desc) as seqnum 
     from table2 t2 
    ) t2 
    on t1.employeeid = t2.employeenumber and seqnum = 1; 
2

कुछ इस तरह की कोशिश करो।

Update T1 Set T1.Title = T2.PositionTitle 
FROM Table1 T1 
JOIN 
(
    SELECT EmployeeNumber,PositionTitle, Max(datepositionstart) AS datepositionstart 
    FROM Table2 group by EmployeeNumber,PositionTitle 
) T2 
on T1.EMPLOYEEID = T2.EmployeeNumber 
2
UPDATE e 

SET E.TITLE = t.[PositionTitle] 

FROM #Table1 e 
JOIN #Table2 t ON t.EMPLOYEEnumber= e.EMPLOYEEID 
WHERE t.datepositionstart = 
      (SELECT MAX(datepositionstart) 
       FROM #table2 hre 
       WHERE hre.EmployeeNumber = E.EMPLOYEEID 
       GROUP BY hre.EMPLOYEEnumber) 

धारणा मैंने बनाया table2.EMPLOYEEnumber एक विदेशी कुंजी जो संदर्भ देता table1.EMPLOYEEID है।

उम्मीद डेटा हासिल नहीं है, क्योंकि table2 में प्रारंभिक डालने निम्नलिखित बनाता है:

EMPLOYEEnumber Name positiontitle  datepositionstart 
1    Tom  System Admin  2014-07-03 
1    Tom  Server Admin  2014-08-13 
1    Tom  Senior Server Admin 2016-07-23 
2    Bob  IT Staff   2014-07-03 
2    Bob  Senior IT Staff  2016-10-15 

मैं, टेबल विशेष रूप से इतिहास तालिकाओं में शामिल होने का एक साधन के रूप में नाम का उपयोग नहीं होगा, क्योंकि लोगों को और बदल सकता हूँ कर सकते हैं उनके समय के साथ नाम।

2

प्रत्येक कर्मचारी के लिए सबसे हाल ही में शीर्षक निर्धारित करने के लिए इस प्रयास करें, आशा है यह मदद करता है,

Update T1 Set T1.Title = d.PositionTitle 
    FROM #Table1 T1 
    JOIN 
    (
     select EMPLOYEEnumber,positiontitle,datepositionstart 
     ,ROW_NUMBER() over (PARTITION BY EMPLOYEEnumber order by datepositionstart desc) rn 
     from #Table2 
    ) d 
    on T1.EMPLOYEEID = d.EmployeeNumber and d.rn = 1 
संबंधित मुद्दे