简体   繁体   English

无需连接即可将一个表中的不同值循环到另一个表

[英]Looping distinct values from one table through another without a join

I know looping is not ideal in SQL, but I couldn't think of another way of doing this. 我知道循环在SQL中并不理想,但我想不出另一种方法。

I want each distinct row from this Table 1 to have each distinct date and hour produced on Table 2. 我希望此表1中的每个不同行在表2中产生每个不同的日期和小时。

In other words, Table 2 has the dates between 05/01/2014 through 04/30/2015, with each distinct date having 24 rows, one for each hour of the day. 换句话说,表2的日期介于2014年5月1日到2015年4月30日之间,每个不同的日期都有24行,一天中的每个小时都有一个行。 I now want each distinct row in Table 1 to have each distinct date on Table 2, with each of its 24 hours. 现在,我希望表1中的每个不同的行在表2中具有每个不同的日期,以及每个24小时。

Table 1: 表格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')

Table 2: 表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

This below attempt did not work. 下面的这种尝试不起作用。 I canceled after the run time exceeded several minutes. 运行时间超过几分钟后,我取消了。

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

So you want all distinct records from table1 paired with all records in table2? 因此,您希望将table1中的所有不同记录与table2中的所有记录配对吗? That is a cross join: 这是交叉连接:

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

Or do you want them related by date? 还是您希望它们按日期关联? Then inner-join: 然后内部联接:

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

You might get better performance from building lists of dates and hours using loops first, and then combining it with the service names just one time using a cross join, something like this. 首先,使用循环构建日期和小时列表,然后一次使用交叉联接将其与服务名称结合起来,可能会获得更好的性能。 You may need to tweak it a bit because you understand the source data: 您可能需要稍微调整一下,因为您了解源数据:

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.

相关问题 从一个表中选择不同的值并连接到另一个表 - Select distinct values from one table and join with another table 联接中另一个表的不同列值 - DISTINCT COLUMN VALUES FROM ANOTHER TABLE IN JOIN DISTINCT from One table and INNER JOIN with another table in snowflake - DISTINCT from One table and INNER JOIN with another table in snowflake 将一个表中的不同值插入到另一个表中 - Insert distinct values from one table into another table SQL:计算一个表中的不同值并按另一表分组 - SQL: Count distinct values from one table and group by another one 从一个表到另一个表插入不同的值和计算字段 - Inserting distinct values and calculated field from one table to another 如何将一个表中的值插入到另一个表中而没有用于内部联接的值? - How do I insert values from one table into another without a value to inner join them? 无需在Vertica中进行联接就可以从另一个表更新一个表吗? - Is it possible to update one table from another table without a join in Vertica? SQL连接-如何选择出现在一个表而不是另一个表中的所有不同值 - SQL join - How to select all the distinct values that appear in one table and not another 联接另一个表而无联接限制 - join another table without a join for limit at one
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM