SQL Server: объединение с использованием объединения на исходной таблице не может быть связано - PullRequest
1 голос
/ 10 марта 2019

Я пишу оператор 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"

Спасибо за вашу помощь заранее. Honkonger.

1 Ответ

0 голосов
/ 10 марта 2019

Нет смысла использовать подзапрос в предложении 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] .......
...