powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по написанию запроса
6 сообщений из 6, страница 1 из 1
Вопрос по написанию запроса
    #40089769
xa1ter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Подскажите, пожалуйста, как реализовать запрос под следующую задачу.
Предположим есть две таблицы, в каждой по два столбца - Товар (ключ) и Цена. Необходимо соединить эти таблицы, например, к первой присоединить вторую и если цены в разрезе товара между таблицами отличаются, тогда необходимо в присоединяемой (вторая) таблице обновить цены (если такого товара нет, тогда добавить новую строку) на основании данных из первой таблицы. Задача звучит просто, но я в T-SQL новичок и для меня на данном этапе проблематично реализовать данный запрос. Единственное пока до чего я додумался - это заполнение одной таблицы на основании другой:

Код: sql
1.
2.
3.
4.
INSERT INTO dbo.tab2 
    SELECT item_num
      , cost
  FROM dbo.tab1



Но для моей задачи это не подходит, так как нет сравнения по цене и при совпадении ключевых полей появится ошибка.

За ранее благодарен за помощь.
...
Рейтинг: 0 / 0
Вопрос по написанию запроса
    #40089773
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычный MERGE INTO table2 USING table1.
...
Рейтинг: 0 / 0
Вопрос по написанию запроса
    #40089849
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xa1ter,

Код: sql
1.
2.
3.
4.
5.
6.
insert t2 (key2, price2)
select key1, price1 from t1  where not exists (select * from t2 where key1=key2)

update t2
from t1
where key2=key1 and price2 <> price1



Найдите учебник по запросам.
...
Рейтинг: 0 / 0
Вопрос по написанию запроса
    #40089985
xa1ter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за ответы!
Учебник есть ("Основы T-SQL"), но недавно отдал его товарищу, на дня заберу обратно.
...
Рейтинг: 0 / 0
Вопрос по написанию запроса
    #40090099
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xa1ter
Большое спасибо за ответы!
Учебник есть ("Основы T-SQL"), но недавно отдал его товарищу, на дня заберу обратно.


Лайфхацк: не забирайте учебник, может, хоть товарищ почитал его, и задайте ему вопрос
...
Рейтинг: 0 / 0
Вопрос по написанию запроса
    #40090385
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IF OBJECT_ID('tempdb..#TestMerge') IS NOT NULL
DROP TABLE #TestMerge;
GO

CREATE TABLE #TestMerge
(
ID INT NOT NULL,
K INT NOT NULL,
T VARCHAR(40) NOT NULL
);

;WITH X AS
(
SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n)
)
INSERT INTO #TestMerge(ID, K, T)
SELECT TOP 30 RN, RN % 4, RIGHT(CONCAT('0000', RN % 17), 3) FROM
(
SELECT
-1 + ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN
FROM X AS X1, X AS X2
) XX
ORDER BY RN ;

SELECT * FROM #TestMerge
ORDER BY K, T;

IF OBJECT_ID('tempdb..#IDS') IS NOT NULL
DROP TABLE #IDS;

CREATE TABLE #IDS(KK INT NOT NULL);
INSERT INTO #IDS(KK) VALUES(0), (1)

;



WITH t AS (
SELECT t.* FROM #TestMerge t
INNER JOIN #IDS I ON I.KK = t.K
)
MERGE t AS target
USING (
SELECT ID, K, T + T AS T FROM #TestMerge WHERE K IN (1, 0) AND ID <= 20
UNION ALL
SELECT 9999, 0, '999999'
UNION ALL
SELECT 8888, 1, '888888'
) AS source
ON source.ID = target.ID AND
source.K = target.K
WHEN MATCHED AND (
source.T <> target.T
)
THEN UPDATE SET
T = source.T
WHEN NOT MATCHED BY TARGET THEN
INSERT (ID, K, T)
VALUES (
ID, K, T
)
WHEN NOT MATCHED BY SOURCE
THEN
DELETE
;

SELECT * FROM #TestMerge
ORDER BY K, T;
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по написанию запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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