Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хранимые процедуры и не сложные запросы / 13 сообщений из 13, страница 1 из 1
09.06.2018, 13:51
    #39658869
chocobear69
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
Добрый день!
В общем проблема у меня такая:
Устраиваюсь на работу в одну приятную контору(надеюсь hrы ихнии тут не сидят)) и мне дали дз вот такого вида:

Напишите SQL операторы (возможно в форме хранимой процедуры), загружающие таблицу T_SOURCE в T_DESTINATION по следующим правилам:

1. Если в T_SOURCE есть строка, для которой в T_DESTINATION нет строк с аналогичными значениями полей K1, K2, то такая строка вставляется в T_DESTINATION.
Поле DTTM = текущая дата + время.

2. Если в T_SOURCE есть строка, для которой в T_DESTINATION есть строка с аналогичными значениями полей K1, K2, то в такой строке T_DESTINATION обновляются значения полей C1, C2 на значения из соответствующей строки T_SOURCE.
Поле DTTM = текущая дата + время.

3. Если в T_DESTINATION есть строка, для которой в T_SOURCE нет строк с аналогичными значениями полей K1, K2, то такая строка удаляется из T_DESTINATION.

4. Используйте SQL операторы insert, update, delete. В качестве СУБД используйте Microsoft SQL Server, возможно установить локально SQL Server Express Edition или использовать http://sqlfiddle.com.

Таблицы T_SOURCE и T_DESTINATION:

CREATE TABLE T_SOURCE
(
K1 INT NOT NULL
, K2 INT NOT NULL
, C1 VARCHAR(10) NULL
, C2 VARCHAR(10) NULL
, PRIMARY KEY (K1, K2)
)
GO

CREATE TABLE T_DESTINATION
(
K1 INT NOT NULL
, K2 INT NOT NULL
, C1 VARCHAR(10) NULL
, C2 VARCHAR(10) NULL
, DTTM DATETIME2 NOT NULL
, PRIMARY KEY (K1, K2)
)
GO

Написал я эти процедуры(опыта работы с sql не очень много у меня, поэтому не уверен - будут ли они работать), если не сложно, проверьте меня))
Сами процедуры:

1)
CREATE PROCEDURE insert_proc
AS
BEGIN
INSERT INTO T_DESTINATION d(K1,K2,C1,C2,DTTM)
SELECT s.*, GETDATE()
FROM T_SOURCE s
WHERE (s.K1,s.K2) NOT IN (SELECT * FROM T_DESTINATION GROUP BY K1,K2)
END
2)
CREATE PROCEDURE insert_proc
AS
BEGIN
UPDATE T_DESTINATION d
SET d.C1 = s.C1,d.C2 = s.C2,DTTM = GETDATE()
FROM T_SOURCE s
WHERE (d.K1,d.K2) IN (SELECT * FROM T_SOURCE GROUP BY (K1,K2)
END
3)
CREATE PROCEDURE insert_proc
AS
BEGIN
DELETE FROM T_DESTINATION d
WHERE (d.K1,d.K2) NOT IN (SELECT K1,K2 FROM T_SOURCE GROUP BY K1,K2)
END

ЗАРАНЕЕ СПАСИБО)
...
Рейтинг: 0 / 0
09.06.2018, 14:06
    #39658877
шК0ДЕР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
chocobear69Устраиваюсь на работу в одну приятную контору(надеюсь hrы ихнии тут не сидят))А потом у нас в стране самолеты падают(с)

chocobear69если не сложно, проверьте меня))а сам?
...
Рейтинг: 0 / 0
09.06.2018, 14:09
    #39658881
шК0ДЕР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
Все что вам надо - это MERGE. Один запрос для всех 3ех пунктов
...
Рейтинг: 0 / 0
09.06.2018, 14:15
    #39658886
chocobear69
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
шК0ДЕР,
Я имел ввиду синтаксис(не выглядит ли код совсем "убого" в глазах опытного кодера), самолеты не будут падать, донт ворри
...
Рейтинг: 0 / 0
09.06.2018, 14:18
    #39658889
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
Синтаксис вами придуман чуть менее, чем полностью. Запросы не скомпилируются даже.
...
Рейтинг: 0 / 0
09.06.2018, 14:18
    #39658890
chocobear69
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
шК0ДЕРВсе что вам надо - это MERGE. Один запрос для всех 3ех пунктов
Ну в задании просто указаны именно эти операторы
"4. Используйте SQL операторы insert, update, delete."
...
Рейтинг: 0 / 0
09.06.2018, 14:20
    #39658893
chocobear69
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
Гавриленко Сергей АлексеевичСинтаксис вами придуман чуть менее, чем полностью. Запросы не скомпилируются даже.
В смысле синтаксис создания хранимых процедур или сами запросы?
...
Рейтинг: 0 / 0
09.06.2018, 14:23
    #39658898
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE PROCEDURE insert_proc
AS
BEGIN
UPDATE T_DESTINATION d 
SET d.C1 = s.C1,d.C2 = s.C2,DTTM = GETDATE() 
FROM T_SOURCE s 
WHERE (d.K1,d.K2) IN (SELECT * FROM T_SOURCE GROUP BY (K1,K2)
END



ТС, проверьте сначала, что тут понаписали.

PS
не будем вдаваться в абсурдность самих этих процедур, но хоть синтаксис то вы должны соблюдать
...
Рейтинг: 0 / 0
09.06.2018, 14:24
    #39658899
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
chocobear69Гавриленко Сергей АлексеевичСинтаксис вами придуман чуть менее, чем полностью. Запросы не скомпилируются даже.
В смысле синтаксис создания хранимых процедур или сами запросы?Во всех смыслах.

Мне вот интересно, вам даже лень установить экспресс или разобраться с указанным сайтом. Зачем вам это?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
CREATE PROCEDURE insert_proc
AS
BEGIN
INSERT INTO T_DESTINATION d(K1,K2,C1,C2,DTTM) 
SELECT s.*, GETDATE() 
FROM T_SOURCE s 
WHERE (s.K1,s.K2) NOT IN (SELECT * FROM T_DESTINATION GROUP BY K1,K2)
END
go
print ('--------------------------------------------------------------------')
go
CREATE PROCEDURE insert_proc
AS
BEGIN
UPDATE T_DESTINATION d 
SET d.C1 = s.C1,d.C2 = s.C2,DTTM = GETDATE() 
FROM T_SOURCE s 
WHERE (d.K1,d.K2) IN (SELECT * FROM T_SOURCE GROUP BY (K1,K2)
END
go
print ('--------------------------------------------------------------------')
go
CREATE PROCEDURE insert_proc
AS
BEGIN
DELETE FROM T_DESTINATION d 
WHERE (d.K1,d.K2) NOT IN (SELECT K1,K2 FROM T_SOURCE GROUP BY K1,K2)
END
go

Msg 102, Level 15, State 1, Procedure insert_proc, Line 4 [Batch Start Line 0]
Incorrect syntax near 'd'.
Msg 4145, Level 15, State 1, Procedure insert_proc, Line 7 [Batch Start Line 0]
An expression of non-boolean type specified in a context where a condition is expected, near ','.
--------------------------------------------------------------------
Msg 102, Level 15, State 1, Procedure insert_proc, Line 4 [Batch Start Line 11]
Incorrect syntax near 'd'.
Msg 102, Level 15, State 1, Procedure insert_proc, Line 7 [Batch Start Line 11]
Incorrect syntax near ','.
--------------------------------------------------------------------
Msg 102, Level 15, State 1, Procedure insert_proc, Line 4 [Batch Start Line 22]
Incorrect syntax near 'd'.
...
Рейтинг: 0 / 0
09.06.2018, 14:24
    #39658900
шК0ДЕР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
chocobear69"4. Используйте SQL операторы insert, update, delete."По твоему в MERGE их нет?
...
Рейтинг: 0 / 0
09.06.2018, 14:54
    #39658927
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
declare @now DATETIME2 = getdate();

-- ну merge то проще и короче.
with s as ( select *, DTTM = @now from T_SOURCE )
   , d as ( select * from T_DESTINATION )
  merge d using s on d.K1 = s.K1 and d.K2 = s.K2
    when not matched by source then delete
    when not matched by target then insert( K1, K2, C1, C2, DTTM ) values( K1, K2, C1, C2, DTTM )
    when matched and exists( select d.C1, d.C2 except select s.C1, s.C2 ) then update set C1 = s.C1, C2 = s.C2, DTTM= s.DTTM
;
----------------------------------------------------------
-- но если упираться без merge
-- сначала удаляем - потом легше - меньше
with s as ( select *, DTTM = @now from T_SOURCE )
   , d as ( select * from T_DESTINATION )
   delete from d where not exists( select * from s where d.K1 = s.K1 and d.K2 = s.K2 )
;
-- потом обновляем
with s as ( select *, DTTM = @now from T_SOURCE )
   , d as ( select * from T_DESTINATION )
   update d set C1 = s.C1, C2 = s.C2, DTTM= s.DTTM
     from d inner join s on d.K1 = s.K1 and d.K2 = s.K2
     where exists( select d.C1, d.C2 except select s.C1, s.C2 )
;
-- потом вставляем
with s as ( select *, DTTM = @now from T_SOURCE )
   , d as ( select * from T_DESTINATION )
   insert d( K1, K2, C1, C2, DTTM ) 
     select K1, K2, C1, C2, DTTM from s where not exists( select * from d where d.K1 = s.K1 and d.K2 = s.K2 )
;
...
Рейтинг: 0 / 0
09.06.2018, 14:55
    #39658928
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
шК0ДЕРПо твоему в MERGE их нет?а смысл?
если у вас задача написать на С++ не нужно предоставлять код на Java утверждая, что внутри JVM есть плюсы.

у ТСа совершенно конкретная задача - показать умение выстроить логику инкрементальной подгрузки используя базовые операции.
...
Рейтинг: 0 / 0
09.06.2018, 14:58
    #39658935
шК0ДЕР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры и не сложные запросы
Дедушкау ТСа совершенно конкретная задача - показать умение выстроить логику инкрементальной подгрузки используя базовые операции.Он ее даже не пытается понять и начать, а просит решение со стороны. Я предложил самое простое. Базовые операции в ней включены.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хранимые процедуры и не сложные запросы / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]