Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Хранимые процедуры и не сложные запросы  [new]
chocobear69
Member

Откуда:
Сообщений: 4
Добрый день!
В общем проблема у меня такая:
Устраиваюсь на работу в одну приятную контору(надеюсь 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

ЗАРАНЕЕ СПАСИБО)
9 июн 18, 13:51    [21481870]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры и не сложные запросы  [new]
шК0ДЕР
Member

Откуда: Издалека долго
Сообщений: 1205
chocobear69
Устраиваюсь на работу в одну приятную контору(надеюсь hrы ихнии тут не сидят))
А потом у нас в стране самолеты падают(с)

chocobear69
если не сложно, проверьте меня))
а сам?
9 июн 18, 14:06    [21481954]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры и не сложные запросы  [new]
шК0ДЕР
Member

Откуда: Издалека долго
Сообщений: 1205
Все что вам надо - это MERGE. Один запрос для всех 3ех пунктов
9 июн 18, 14:09    [21481965]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры и не сложные запросы  [new]
chocobear69
Member

Откуда:
Сообщений: 4
шК0ДЕР,
Я имел ввиду синтаксис(не выглядит ли код совсем "убого" в глазах опытного кодера), самолеты не будут падать, донт ворри
9 июн 18, 14:15    [21481986]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры и не сложные запросы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36980
Синтаксис вами придуман чуть менее, чем полностью. Запросы не скомпилируются даже.
9 июн 18, 14:18    [21481993]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры и не сложные запросы  [new]
chocobear69
Member

Откуда:
Сообщений: 4
шК0ДЕР
Все что вам надо - это MERGE. Один запрос для всех 3ех пунктов

Ну в задании просто указаны именно эти операторы
"4. Используйте SQL операторы insert, update, delete."
9 июн 18, 14:18    [21481997]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры и не сложные запросы  [new]
chocobear69
Member

Откуда:
Сообщений: 4
Гавриленко Сергей Алексеевич
Синтаксис вами придуман чуть менее, чем полностью. Запросы не скомпилируются даже.

В смысле синтаксис создания хранимых процедур или сами запросы?
9 июн 18, 14:20    [21482006]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры и не сложные запросы  [new]
Konst_One
Member

Откуда:
Сообщений: 11520
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
не будем вдаваться в абсурдность самих этих процедур, но хоть синтаксис то вы должны соблюдать
9 июн 18, 14:23    [21482016]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры и не сложные запросы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36980
chocobear69
Гавриленко Сергей Алексеевич
Синтаксис вами придуман чуть менее, чем полностью. Запросы не скомпилируются даже.

В смысле синтаксис создания хранимых процедур или сами запросы?
Во всех смыслах.

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

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'.
9 июн 18, 14:24    [21482018]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры и не сложные запросы  [new]
шК0ДЕР
Member

Откуда: Издалека долго
Сообщений: 1205
chocobear69
"4. Используйте SQL операторы insert, update, delete."
По твоему в MERGE их нет?
9 июн 18, 14:24    [21482019]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры и не сложные запросы  [new]
aleks222
Member

Откуда:
Сообщений: 985
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 )
;
9 июн 18, 14:54    [21482119]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры и не сложные запросы  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
шК0ДЕР
По твоему в MERGE их нет?
а смысл?
если у вас задача написать на С++ не нужно предоставлять код на Java утверждая, что внутри JVM есть плюсы.

у ТСа совершенно конкретная задача - показать умение выстроить логику инкрементальной подгрузки используя базовые операции.
9 июн 18, 14:55    [21482124]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры и не сложные запросы  [new]
шК0ДЕР
Member

Откуда: Издалека долго
Сообщений: 1205
Дедушка
у ТСа совершенно конкретная задача - показать умение выстроить логику инкрементальной подгрузки используя базовые операции.
Он ее даже не пытается понять и начать, а просит решение со стороны. Я предложил самое простое. Базовые операции в ней включены.
9 июн 18, 14:58    [21482137]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить