SQL Server: не удается выполнить привязку с использованием объединения в исходной таблице

#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] .......