2015-06-22 72 views
1

我知道循環在SQL中並不理想,但我想不出另一種方式來實現這一點。通過另一個表通過另一個表循環不同的值而不加入

我想從該表1的每個不同的行,從而具有對錶2中

產生換言之每個不同的日期和小時,表2具有通過2015年4月30日2014年5月1日之間的日期,每個不同的日期有24行,每天一個小時。我現在希望表1中每個不同的行在表2中每個不同的日期,每個24小時。

表1:

DROP TABLE Baylor_Raw..MEDICAL_SERVICE_DESC 
SELECT MEDICAL_SERVICE_DESC 
INTO Baylor_Raw..MEDICAL_SERVICE_DESC 
FROM Baylor_Raw..Raw_ADT 
WHERE MEDICAL_SERVICE_DESC IS NOT NULL AND MEDICAL_SERVICE_DESC NOT IN ('#N/A','CANCEL','DAY SURGERY','HOSPICE','INFUSION') 

表2:

DECLARE @DATE DATE 
SET @DATE = '05/01/2014' 

DECLARE @HOUR INT 
SET @HOUR = 0 

DROP TABLE Baylor_Raw..DateTable 
CREATE TABLE Baylor_Raw..DateTable 
    (DATE_OF_DISCHARGE DATE 
    ,HOUR_OF_DISCHARGE INT) 


WHILE @DATE<'05/01/2015' BEGIN 
    WHILE @HOUR<25 BEGIN 
     INSERT INTO Baylor_Raw..DateTable (DATE_OF_DISCHARGE,HOUR_OF_DISCHARGE) 
     VALUES (@DATE,@HOUR) 
     SET @HOUR = @HOUR+1 
    END 
    SET @DATE = DATEADD(DD,1,@DATE) 
    SET @HOUR = 0 
END 

這下面嘗試沒有工作。運行時間超過幾分鐘後,我取消了。

DECLARE @MEDICAL_SERVICE_DESC NVARCHAR(255) 
SET @MEDICAL_SERVICE_DESC = (SELECT MIN(MEDICAL_SERVICE_DESC) FROM Baylor_Raw..MEDICAL_SERVICE_DESC) 

DECLARE @DATE DATE 
SET @DATE = '05/01/2014' 

DECLARE @HOUR INT 
SET @HOUR = 0 

DROP TABLE Baylor_Raw..DateTable 
CREATE TABLE Baylor_Raw..DateTable 
(MEDICAL_SERVICE_DESC NVARCHAR, 
DATE_OF_DISCHARGE DATE 
,HOUR_OF_DISCHARGE INT) 

WHILE @MEDICAL_SERVICE_DESC IS NOT NULL BEGIN 
    WHILE @DATE<'05/01/2015' BEGIN 
     WHILE @HOUR<25 BEGIN 
      INSERT INTO Baylor_Raw..DateTable (MEDICAL_SERVICE_DESC,DATE_OF_DISCHARGE,HOUR_OF_DISCHARGE) 
      VALUES (@MEDICAL_SERVICE_DESC,@DATE,@HOUR) 
      SET @HOUR = @HOUR+1 
     END 
     SET @DATE = DATEADD(DD,1,@DATE) 
     SET @HOUR = 0 
    END 
DELETE FROM Baylor_Raw..MEDICAL_SERVICE_DESC WHERE MEDICAL_SERVICE_DESC = @MEDICAL_SERVICE_DESC 
SET @MEDICAL_SERVICE_DESC = (SELECT MIN(MEDICAL_SERVICE_DESC) FROM Baylor_Raw..MEDICAL_SERVICE_DESC) 
SET @DATE = '05/01/2014' 
END 
+0

我現在就告訴你,我認爲你沒有正確接近這個。嘗試用文字解釋你正在試圖達到什麼樣的表格?然後提供一些基本的輸入和輸出樣本數據。我敢打賭,沒有循環就有更簡單的方法來做到這一點。 – Stephan

+1

我同意。但是,我只需要創建這個表格,這就是爲什麼我使用循環就足夠了。 – Nikolas

+0

哦,這並不壞。那麼,我很高興thorsten得到你的問題回答! – Stephan

回答

0

所以你希望table1中的所有不同記錄與table2中的所有記錄配對?這是一個交叉連接:

select * 
from (select distinct * from table1) t1 
cross join table2; 

或者你想讓它們按日期關聯嗎?然後內加入:

select * 
from (select distinct * from table1) t1 
inner join table2 t2 on t1.date = t2.date; 
0

你可能會使用一個交叉連接,這樣的建築使用循環第一日期和時間的列表,然後將其與服務名稱合併只是一個時間獲得更好的性能。您可能需要稍微調整一下,因爲您瞭解源數據:

DECLARE @dates TABLE (DATE DATE) 
DECLARE @hours TABLE (hours INT) 
DECLARE @hour INT 
    ,@date DATE 

SET @hour = 0 
SET @date = '05/01/2014' 

WHILE (@hour < 25) 
BEGIN 
    INSERT INTO @hours 
    SELECT @hour 

    SET @hour = @hour + 1 
END 

WHILE (@ DATE < '05/01/2015') 
BEGIN 
    INSERT INTO @dates 
    SELECT @date 

    SET @DATE = DATEADD(DD, 1, @DATE) 
END 

INSERT INTO Baylor_Raw..DateTable (
    MEDICAL_SERVICE_DESC 
    ,DATE_OF_DISCHARGE 
    ,HOUR_OF_DISCHARGE 
    ) 
SELECT MEDICAL_SERVICE_DESC 
    ,DATE 
    ,hour 
FROM Baylor_Raw..MEDICAL_SERVICE_DESC 
CROSS JOIN @date d 
CROSS JOIN @hours h