[英]Looping distinct values from one table through another without a join
我知道循環在SQL中並不理想,但我想不出另一種方法。
我希望此表1中的每個不同行在表2中產生每個不同的日期和小時。
換句話說,表2的日期介於2014年5月1日到2015年4月30日之間,每個不同的日期都有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
因此,您希望將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;
首先,使用循環構建日期和小時列表,然后一次使用交叉聯接將其與服務名稱結合起來,可能會獲得更好的性能。 您可能需要稍微調整一下,因為您了解源數據:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.