#sql #sql-server #join #sql-merge
#sql #sql-server #Присоединиться #sql-слияние
Вопрос:
Я пишу инструкцию SQL Server Merge
, но, похоже, не могу получить правильный синтаксис. Кто-нибудь, пожалуйста, взгляните, чтобы увидеть, где я ошибаюсь?
Мы высоко ценим любую помощь, которую вы можете оказать.
У меня есть две таблицы, которые я хотел бы объединить ( w_materialmarketprices2
и d_component
). Моя исходная ( d_component
) таблица требует, чтобы я выполнил объединение с налоговой таблицей ( d_tax
).
Все работает нормально, за исключением случаев, когда я пытаюсь добавить дополнительную налоговую таблицу в свое объединение. Причина, по которой мне нужна таблица налогов, заключается в том, что она содержит налоговую ставку, которой нет в моей d_component
таблице (хотя у меня есть соответствующий налоговый код).
Мои критерии сравнения между w_materialmarketprices2
и d_component
включают налоговую ставку в расчет.
Вот мой код:
MERGE [DWH].[dbo].[w_materialmarketprices2] AS A
USING
(SELECT
[comp_code], [comp_desc], [comp_o_un], [comp_type],
[comp_ccy], [comp_tx], [comp_net_price], [comp_per],
[comp_doc_date], [comp_last_update], [comp_latest],
D.[tax_rate] AS TaxRate
FROM
[DWH].[dbo].[d_component]) AS B
INNER JOIN
[DWH].[dbo].[d_tax] AS D ON D.[tax_code] = B.[comp_tx]
ON
A.[mp_comp_code] = B.[comp_code] AND A.[mp_valid_date] = B.[comp_doc_date] AND B.[comp_net_price]>0 AND A.[mp_price_inc_vat] = ROUND(((B.[comp_net_price]/B.[comp_per])*(1 TaxRate),3) AND A.[mp_budget_actual] = 'PO Actual' AND B.[comp_type] ='P100' AND (left(B.[comp_code],1)='S' OR left(B.[comp_code],1)='R')
WHEN NOT MATCHED BY TARGET
THEN
INSERT ([mp_budget_actual], [mp_comp_code], [mp_comp_desc], [mp_unit], [mp_unit_qty], [mp_qualified_supplier], [mp_ccy], [mp_price_inc_vat], [mp_valid_date], [mp_last_update], [mp_latest])
VALUES ('PO Actual', B.[comp_code], B.[comp_desc], B.[comp_o_un], 1, 'Y', B.[comp_ccy], ROUND(((B.[comp_net_price]/B.[comp_per])*(1 TaxRate),3), B.[comp_doc_date], B.[comp_last_update], B.[comp_latest])
;
Ошибка, которую я получаю, заключается в:
Сообщение 4145, уровень 15, состояние 1, строка 20
Выражение неблевого типа, указанное в контексте, где ожидается условие, рядом с ‘,’.Сообщение 102, уровень 15, состояние 1, строка 23
Неправильный синтаксис рядом с ‘B’.
,D.[tax_rate] AS TaxRate
отображается как подчеркнутое красным, поэтому я считаю, что проблема как-то связана с этим. Я также получаю сообщение
Не удалось привязать состоящий из нескольких частей идентификатор «D.tax_rate»
Заранее спасибо за вашу помощь. Сигнальщик.
Комментарии:
1. Что
inner join
послеUsing ... B
? B — это исходная таблица, почему после этого выполняется объединение?2. Вы просто вставляете? Я предлагаю вам использовать
INSERT/SELECT WHERE NOT EXISTS
вместоMERGE
Ответ №1:
Нет причин использовать подзапрос в USING
предложении, т.Е.: не вставляйте SELECT
туда:
MERGE [DWH].[dbo].[w_materialmarketprices2] AS A
USING
[DWH].[dbo].[d_component] AS B
INNER JOIN [DWH].[dbo].[d_tax] AS D ON D.[tax_code] = B.[comp_tx]
ON
A.[mp_comp_code] = B.[comp_code] .......