Sql 在没有联接的情况下,将不同的值从一个表循环到另一个表

Sql 在没有联接的情况下,将不同的值从一个表循环到另一个表,sql,sql-server,tsql,while-loop,Sql,Sql Server,Tsql,While Loop,我知道循环在SQL中并不理想,但我想不出其他方法来实现这一点 我希望表1中的每一行都在表2中生成不同的日期和时间 换句话说,表2的日期介于2014年1月5日至2015年3月30日之间,每个不同的日期有24行,一天中每小时一行。现在,我希望表1中的每一行在表2中都有不同的日期,每个日期都是24小时 表1: DROP TABLE Baylor_Raw..MEDICAL_SERVICE_DESC SELECT MEDICAL_SERVICE_DESC INTO Baylor_Raw..MEDICAL

我知道循环在SQL中并不理想,但我想不出其他方法来实现这一点

我希望表1中的每一行都在表2中生成不同的日期和时间

换句话说,表2的日期介于2014年1月5日至2015年3月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@DATE
设置日期='2014年1月5日'
声明@HOUR INT
设置@HOUR=0
DROP TABLE Baylor_Raw..DateTable
创建表Baylor_Raw..DateTable
(出院日期)
,每小时(分钟)

而@DATE那么您希望表1中的所有不同记录与表2中的所有记录配对?这是一个交叉连接:

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
DECLARE@dates表(日期)
声明@hours表(hours INT)
声明@hour INT
日期
设置@hour=0
设置日期='2014年1月5日'
而(@小时<25)
开始
插入@hours
选择@hour
设置@hour=@hour+1
结束
而(@日期<'05/01/2015')
开始
在@dates中插入
选择@date
设置@DATE=DATEADD(日期,1,@DATE)
结束
插入Baylor_原始..日期表(
医疗服务说明
,出院日期
,出院时数
)
选择医疗服务描述
,日期
,小时
来自贝勒的原始信息。医疗服务描述
交叉连接@日期d
交叉连接@h小时

我现在就告诉你,我认为你的做法不对。试着用语言解释你想要达到的目标,比如这些表格到底是用来做什么的?然后用样本数据提供一些基本的输入和输出。我打赌有一种更简单的方法可以做到这一点,而不需要循环。我同意。但是,我只需要创建一次这个表,这就是为什么我认为使用一个循环就足够了。哦,这还不错。我很高兴thorsten回答了你的问题!
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