Mohamed Hashem Ответов: 1

Хранимая процедура обновления табличных данных в oracle


Дорогой все у меня есть две таблицы в базе данных сначала это следующее :
EmployeeID   01/04/2017   02/04/2017    03/04/2017   04/04/2017
----------------------------------------------------------------
1             1-9,6
2
3
4


вторая таблица-это
EmployeeID    DayDate       SCHEDULEID    SHIFT 
------------------------------------------------
1            01/04/2017        1             9,6
1            02/04/2017        1             5
1            03/04/2017        30            7,6
1            04/04/2017        30            9
2            01/04/2017        30            9
2            02/04/2017        6             3
3            01/04/2017        6             7,6
3            03/04/2017        6             9

я хочу сделать хранимую процедуру или SQL-инструкцию для обновления данных первой таблицы из второй, чтобы установить данные, как для employeeid =1 в дате 01/04/2017
SCHEDULEID-сдвиг, который составляет 1-9, 6

Что я уже пробовал:

Я пытался сделать это с помощью курсора и цикла через первую таблицу и выбрать значение сдвига из второй таблицы, а затем обновить данные столбца, но это не работает должным образом
так что можете получить помощь в этом !!

CHill60

Редко вообще возникает необходимость использовать цикл в T-SQL!

Mohamed Hashem

могу ли я получить данные первой таблицы с помощью собственного sql??!

CHill60

Вы можете повернуть вторую таблицу, чтобы получить первую ... Я просто пытаюсь разобраться в Примере, но эта ссылка - это то, что я имею в виду - Oracle / PLSQL: сводное предложение[^]

Mohamed Hashem

У меня есть обновление к вопросу, которое прояснит, почему не использовать Pivot

1 Ответов

Рейтинг:
2

CHill60

Хорошо, во - первых-мои извинения, следующее решение находится в T-SQL для SQL Server. SQLFiddle не работает для меня прямо сейчас, и я unistalled Oracle несколько недель назад.

Это тот принцип, который я имею в виду, используйте ссылку, которую я дал в своем комментарии выше, чтобы настроить этот код для работы на Oracle (если он еще не работает)

select EmployeeID, ISNULL([01/04/2017],''),ISNULL([02/04/2017],''),ISNULL([03/04/2017],''),ISNULL([04/04/2017],'')
FROM
(
	select EmployeeID, DayDate, [Shift]
	from table2
) AS Q
PIVOT
(
	Max([Shift]) for DayDate IN ([01/04/2017],[02/04/2017],[03/04/2017],[04/04/2017])
) AS pvt

Результаты таковы
1	9	5	7,6	9
2	9	3		
3	7,6		9	


Кроме того, это очень плохой дизайн базы данных. Вы никогда не должны разделять элементы в столбце запятыми - используйте другую таблицу и связывайте ее, или разрешайте несколько записей на одного сотрудника на дату (если номер смены отличается)

[EDIT - OP немного изменил требования]
Вероятно, это все еще потребует некоторой корректировки для работы в Oracle
INSERT INTO table1 (EmployeeID, [01/04/2017],[02/04/2017],[03/04/2017],[04/04/2017])
(
	select EmployeeID, ISNULL([01/04/2017],''),ISNULL([02/04/2017],''),ISNULL([03/04/2017],''),ISNULL([04/04/2017],'')
	FROM
	(
		select EmployeeID, DayDate, RES = TO_CHAR([SCHEDULEID]) + '-'+[Shift]
		from table2
	) 
	PIVOT
	(
		Max(RES) for DayDate IN ([01/04/2017],[02/04/2017],[03/04/2017],[04/04/2017])
	) 
);


Mohamed Hashem

спасибо, я знаю, но этот дизайн уже существует.

Maciej Los

5ед!

Mohamed Hashem

Спасибо, но это не работает

CHill60

Что же происходит? Вы получаете какие-то результаты или получаете ошибку? Если это ошибка, изменили ли вы запрос в соответствии с синтаксисом Oracle в соответствии со ссылкой?