powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хранимые процедуры и не сложные запросы
13 сообщений из 13, страница 1 из 1
Хранимые процедуры и не сложные запросы
    #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
Хранимые процедуры и не сложные запросы
    #39658877
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chocobear69Устраиваюсь на работу в одну приятную контору(надеюсь hrы ихнии тут не сидят))А потом у нас в стране самолеты падают(с)

chocobear69если не сложно, проверьте меня))а сам?
...
Рейтинг: 0 / 0
Хранимые процедуры и не сложные запросы
    #39658881
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все что вам надо - это MERGE. Один запрос для всех 3ех пунктов
...
Рейтинг: 0 / 0
Хранимые процедуры и не сложные запросы
    #39658886
chocobear69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
шК0ДЕР,
Я имел ввиду синтаксис(не выглядит ли код совсем "убого" в глазах опытного кодера), самолеты не будут падать, донт ворри
...
Рейтинг: 0 / 0
Хранимые процедуры и не сложные запросы
    #39658889
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синтаксис вами придуман чуть менее, чем полностью. Запросы не скомпилируются даже.
...
Рейтинг: 0 / 0
Хранимые процедуры и не сложные запросы
    #39658890
chocobear69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
шК0ДЕРВсе что вам надо - это MERGE. Один запрос для всех 3ех пунктов
Ну в задании просто указаны именно эти операторы
"4. Используйте SQL операторы insert, update, delete."
...
Рейтинг: 0 / 0
Хранимые процедуры и не сложные запросы
    #39658893
chocobear69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей АлексеевичСинтаксис вами придуман чуть менее, чем полностью. Запросы не скомпилируются даже.
В смысле синтаксис создания хранимых процедур или сами запросы?
...
Рейтинг: 0 / 0
Хранимые процедуры и не сложные запросы
    #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
Хранимые процедуры и не сложные запросы
    #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
Хранимые процедуры и не сложные запросы
    #39658900
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chocobear69"4. Используйте SQL операторы insert, update, delete."По твоему в MERGE их нет?
...
Рейтинг: 0 / 0
Хранимые процедуры и не сложные запросы
    #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
Хранимые процедуры и не сложные запросы
    #39658928
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРПо твоему в MERGE их нет?а смысл?
если у вас задача написать на С++ не нужно предоставлять код на Java утверждая, что внутри JVM есть плюсы.

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


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