2015-06-09 28 views
0

我有兩個具有相同列數的表,但數據在少數列上不同。如何通過刪除基於少量列值的重複項從兩個表中獲取數據

例子:第一個表中的數據

Apt_ID Res_ID Subject  SartTime    EndTime   Color 
    0  1  Avail 06-10-2015 08:00:0 06-10-2015 08:30:0  Blue 
    0  1  Avail 06-10-2015 08:30:0 06-10-2015 09:00:0  Blue 
    0  2  Avail 06-15-2015 08:00:0 06-15-2015 08:30:0  Black 

從第二表結果

Apt_ID Res_ID Subject  SartTime    EndTime   Color 
    1  1  Booked 06-10-2015 08:00:0 06-10-2015 08:30:0  Blue 
    2  1  Booked 06-10-2015 08:30:0 06-10-2015 08:40:0  Blue 

我需要的是:

  1. 我需要從兩個表合併記錄,然後更換 第一個表中的記錄與第二個表記錄 Res_ID,sta rtTime和endTime列匹配。
  2. 如果記錄從TABLE_2開始和TABLE_1結束時間槽之間下降,

我需要替換TABLE_1記錄,並添加一個新的記錄,其餘時隙(請參考第二行中的表1和2)。

預期結果:

Apt_ID Res_ID Subject  SartTime    EndTime   Color 
    1  1  Booked 06-10-2015 08:00:0 06-10-2015 08:30:0  Blue 
    2  1  Booked 06-10-2015 08:30:0 06-10-2015 08:40:0  Blue 
    0  1  Avail  06-10-2015 08:40:0 06-10-2015 09:00:0  Blue 
    0  2  Avail  06-15-2015 08:00:0 06-15-2015 08:30:0  Black 

希望我是有意義的,如果不是請讓我知道。

我新的SQL,我盡我所能得到這個done.So到目前爲止,我還使用「聯盟」嘗試,但作爲列值不一樣,記錄不會被替換,並重復。另外我正在使用遊標來處理這個問題,但想知道是否有一個有效的解決方案。

+0

我建議你試試右鍵連接sql查詢 –

回答

0

編輯:原來MySQL不支持完整的連接語法。謝謝@ jarlh - 當我認爲基本的SQL不在MYSQL中時,我總是感到驚訝。然而,它可以充分使用右和左連接的聯合來模擬。我會在下面展示。

我開始看這個問題了幾次,但我想我明白你的要求的至少一部分。

你絕對不需要的光標。你可能可以使用一個UNION,但我會用一個FULL JOIN和COALESCE來產生結果集。

--create測試數據

CREATE TABLE Avail (Apt_ID INT, Res_ID INT, Subject VARCHAR(10), StartTime DATETIME, EndTime DATETIME, Color VARCHAR(10)) 
    INSERT INTO Avail (Apt_ID ,Res_ID,Subject,StartTime,EndTime,Color) VALUES (0,1,'Avail','06-10-2015 08:00:00','06-10-2015 08:30:0','Blue') 
    INSERT INTO Avail (Apt_ID ,Res_ID,Subject,StartTime,EndTime,Color) VALUES (0,1,'Avail','06-10-2015 08:30:0','06-10-2015 09:00:0','Blue') 
    INSERT INTO Avail (Apt_ID ,Res_ID,Subject,StartTime,EndTime,Color) VALUES (0,2,'Avail','06-15-2015 08:00:0','06-15-2015 08:30:0','Black') 

    CREATE TABLE Booked (Apt_ID INT, Res_ID INT, Subject VARCHAR(10), StartTime DATETIME, EndTime DATETIME, Color VARCHAR(10)) 

    INSERT INTO Booked (Apt_ID ,Res_ID,Subject,StartTime,EndTime,Color) VALUES (1,1,'Booked','06-10-2015 08:00:0','06-10-2015 08:30:0','Blue') 
    INSERT INTO Booked (Apt_ID ,Res_ID,Subject,StartTime,EndTime,Color) VALUES (2,1,'Booked','06-10-2015 08:30:0','06-10-2015 08:40:0','Blue') 

--get the combined result set, preferrin values from the booked table. 
    SELECT COALESCE(b.Apt_ID,a.Apt_ID) Apt_ID 
      ,COALESCE(b.Subject,a.Subject) Subject 
      ,COALESCE(a.Res_ID,b.Res_ID) Res_ID 
      ,COALESCE(a.StartTime,b.StartTime) StartTime 
      ,COALESCE(a.EndTime,b.EndTime) EndTime 
      ,COALESCE(b.Color,a.Color) Color 
     FROM Avail a 
      FULL JOIN 
      Booked b ON a.Res_ID=b.Res_ID 
        AND a.StartTime=b.StartTime 
        AND a.EndTime=b.EndTime 

編輯:使用全仿真一起爲MySQL:

SELECT COALESCE(b.Apt_ID,a.Apt_ID) Apt_ID 
     ,COALESCE(b.Subject,a.Subject) Subject 
     ,a.Res_ID 
     ,a.StartTime 
     ,a.EndTime 
     ,COALESCE(b.Color,a.Color) Color 
    FROM Avail a LEFT JOIN Booked b ON a.Res_ID=b.Res_ID 
          AND a.StartTime=b.StartTime 
          AND a.EndTime=b.EndTime 
UNION 
SELECT COALESCE(b.Apt_ID,a.Apt_ID) Apt_ID 
     ,COALESCE(b.Subject,a.Subject) Subject 
     ,b.Res_ID 
     ,b.StartTime 
     ,b.EndTime 
     ,COALESCE(b.Color,a.Color) Color 
FROM Avail a RIGHT JOIN Booked b ON a.Res_ID=b.Res_ID 
           AND a.StartTime=b.StartTime 
           AND a.EndTime=b.EndTime 

編輯2:男孩是在MySQL比TSQL更難。在沒有完整聯接,ISNULL,ROW_NUMBER或CTE的情況下做。幾乎肯定有更好的方法來做到這一點,但它似乎工作。

Fiddle表明這一點。你會想要一個臨時表,但SQLFiddle.com抱怨。

CREATE TABLE Avail (Apt_ID INT, Res_ID INT, Subject VARCHAR(10), StartTime DATETIME, EndTime DATETIME, Color VARCHAR(10)); 
INSERT INTO Avail (Apt_ID ,Res_ID,Subject,StartTime,EndTime,Color) VALUES (0,1,'Avail','2015-06-10 08:00:00','2015-06-10 08:30:0','Blue'); 
INSERT INTO Avail (Apt_ID ,Res_ID,Subject,StartTime,EndTime,Color) VALUES (0,1,'Avail','2015-06-10 08:30:0','2015-06-10 09:00:0','Blue'); 
INSERT INTO Avail (Apt_ID ,Res_ID,Subject,StartTime,EndTime,Color) VALUES (0,2,'Avail','2015-06-15 08:00:0','2015-06-15 08:30:0','Black'); 

CREATE TABLE Booked (Apt_ID INT, Res_ID INT, Subject VARCHAR(10), StartTime DATETIME, EndTime DATETIME, Color VARCHAR(10)); 
INSERT INTO Booked (Apt_ID ,Res_ID,Subject,StartTime,EndTime,Color) VALUES (1,1,'Booked','2015-06-10 08:00:0','2015-06-10 08:30:0','Blue'); 
INSERT INTO Booked (Apt_ID ,Res_ID,Subject,StartTime,EndTime,Color) VALUES (2,1,'Booked','2015-06-10 08:30:0','2015-06-10 08:40:0','Blue'); 

CREATE TEMPORARY TABLE tmp (Apt_ID INT, Subject VARCHAR(10), Res_ID INT, StartTime DateTime, EndTime DateTime, Color VARCHAR(10), rn INT); 

SET @row_number=0; 

INSERT INTO tmp (Apt_ID , Subject , Res_ID , StartTime , EndTime , Color, rn) 
SELECT Apt_ID , Subject , Res_ID , StartTime , EndTime , Color, 
     (@row_number:[email protected]_number+1) rn 
    FROM (
      SELECT COALESCE(b.Apt_ID,a.Apt_ID) Apt_ID 
        ,COALESCE(b.Subject,a.Subject) Subject 
        ,a.Res_ID 
        ,a.StartTime 
        ,a.EndTime 
        ,COALESCE(b.Color,a.Color) Color 
       FROM Avail a LEFT JOIN Booked b ON a.Res_ID=b.Res_ID 
             AND a.StartTime=b.StartTime 
             AND a.EndTime=b.EndTime 
      UNION 
      SELECT COALESCE(b.Apt_ID,a.Apt_ID) Apt_ID 
        ,COALESCE(b.Subject,a.Subject) Subject 
        ,b.Res_ID 
        ,b.StartTime 
        ,b.EndTime 
        ,COALESCE(b.Color,a.Color) Color 
      FROM Avail a RIGHT JOIN Booked b ON a.Res_ID=b.Res_ID 
              AND a.StartTime=b.StartTime 
              AND a.EndTime=b.EndTime 
     ) x 
    ORDER BY Res_ID,StartTime,EndTime 

SELECT Apt_ID, Subject, Res_ID 
     ,CASE WHEN COALESCE((SELECT EndTime FROM tmp b WHERE b.Res_ID = a.Res_ID AND b.rn = a.rn - 1),0) > StartTime 
      THEN (SELECT EndTime FROM tmp b WHERE b.Res_ID = a.Res_ID AND b.rn = a.rn - 1) 
      ELSE StartTime END StartTime 
     ,EndTime 
     ,Color 
FROM tmp a 
+0

MySQL支持完全外連接嗎? – jarlh

+0

感謝Karl提供的解決方案,除了結果不顯示記錄需要拆分的部分之外,它幾乎可以工作。例如在table_1中,我有一個從8.30到9的預約記錄。00,在table_2中,我預約了8.30 - 8.40的預約。因此,最終結果我需要顯示從8.30 - 8.40預約的預約和從8.40 - 9.00預約的預約。預期結果請參閱第二和第三行。 – user2502961

+0

啊。是的,這與我的意思有關,「我想我至少明白你問的部分內容。」 –

相關問題