編輯:原來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
我建議你試試右鍵連接sql查詢 –