2015-06-22 5 views
1

Я знаю, что цикл не идеален в SQL, но я не мог придумать другого способа сделать это.Цитирование отдельных значений из одной таблицы через другую без объединения

Я хочу каждую отдельную строку из этой таблицы 1, чтобы каждая отдельная дата и час, полученной в таблице 2.

Других словах, в таблице 2 имеет период между 05/01/2014 через 04/30/2015 , с каждой отдельной датой, имеющей 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

О, это не так уж плохо. Ну, я рад, что у тебя на вопрос ответили! – Stephan

ответ

0

Таким образом, вы хотите, чтобы все отдельные записи из таблицы 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; 
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 
Смежные вопросы