Преобразование вычисляемого поля Access в T-SQL - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь вручную перенести запрос доступа, который на самом деле является выражением (вычисляемое поле в доступе.

Выражение доступа, о котором идет речь:

Balance2: (IIf(([OutstandingBalance]-nz([PartsStockForJobTotals]! 
[Expr1]))>0,([OutstandingBalance]-nz([PartsStockForJobTotals]![Expr1])),0))* 
[Part Assembly Link Table]![Qty]

Пока мне удалось написать код SQL:

SELECT
IIF([Order Transactions Table].[OutstandingBalance] - 
ISNULL([PartsStockForJobTotals].[EXPR1], 0) >0,
[Order Transactions Table].[OutstandingBalance] - 
ISNULL([PartsStockForJobTotals].[EXPR1], 0), 0 *
[Part Assembly Link Table].[QTY]) AS Balance2,

FROM ((([PART LIBARY HEADER] 
INNER JOIN [Part Assembly Link Table] 
ON [PART LIBARY HEADER].PartID = [Part Assembly Link Table].PartIDParent) 
INNER JOIN [PART LIBARY HEADER] AS [PART LIBARY HEADER_1] 
ON [Part Assembly Link Table].PartIDChild = [PART LIBARY HEADER].PartID) 
INNER JOIN [Order Transactions Table] 
ON [PART LIBARY HEADER].[Part Number] = [Order Transactions Table].[Part 
Number]) 
LEFT JOIN PartsStockForJobTotals 
ON [Order Transactions Table].[Item Referance] = PartsStockForJobTotals. 
[Item Referance]

Теперь все до этой точки возвращает записи. Однако я пытаюсь отфильтровать только те записи, где ' Balance2 ' больше 0.

Это предложение WHERE, которое я использую, но оно не получает строк:

WHERE 
IIF([Order Transactions Table].[OutstandingBalance] - 
ISNULL([PartsStockForJobTotals].[EXPR1], 0) >0,
[Order Transactions Table].[OutstandingBalance] - 
ISNULL([PartsStockForJobTotals].[EXPR1], 0), 0 *
[Part Assembly Link Table].[QTY]) > 0;

Очевидно, что псевдонимы не разрешено использовать в предложениях WHERE, поэтому я просто скопировал и вставил ' Balance2 ' в оператор where и добавил его с > 0

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Я бы написал так:

     (CASE WHEN ott.[OutstandingBalance] < COALESCE(psfjt.[EXPR1], 0)
           THEN ott.[OutstandingBalance] - COALESCE(psfjt.[EXPR1], 0)
           ELSE 0 
      END) * palt.[Qty] AS Balance2
  . . .
FROM . . .
     [Order Transactions Table] ott . . .
     [PartsStockForJobTotals] psfjt . . .
     [Part Assembly Link Table] palt

Псевдонимы таблиц облегчают написание и чтение запроса.

Тогда WHERE будет:

WHERE (ott.OutstandingBalance - COALESCE(psfjt.EXPR1, 0)) * palt.qty > 0

Я не думаю, что условная логика необходима в WHERE.

0 голосов
/ 30 августа 2018

Мне удалось решить эту проблему! Спасибо за @ Jnevill и @ Гордон Линофф за упрощение кода, но мое предложение WHERE не работало, потому что у меня была неправильная связь между таблицами. Access создает временные таблицы, когда в палитру запросов добавляется несколько экземпляров. Он добавляет второй экземпляр с _1 , который в моем случае был PART LIBARY HEADER_1

Первоначально мои Joins не указали это соединение:

PART LIBARY HEADER ----> PART ASSEMBLY LINK TABLE ----> PART LIBARY HEADER_1

Но после повторного выполнения объединения предложение where, предоставленное @ Гордоном Линоффом , похоже, сработало. Точные результаты возвращаются так же, как в Access.

Спасибо за вашу помощь!

0 голосов
/ 29 августа 2018

Быстрая перезапись вашей переписки, чтобы сделать ее более производительной и переносимой:

CASE 
  WHEN [Order Transactions Table].[OutstandingBalance] < [PartsStockForJobTotals].[EXPR1] 
    THEN [Order Transactions Table].[OutstandingBalance] - ISNULL([PartsStockForJobTotals].[EXPR1], 0)
  ELSE 0 
  END AS Balance2

Переключение здесь для использования оператора CASE, который похож на IIF(), но более переносим (будет работать в любой СУБД, кроме Access), где IIF() будет работать только на более новых версиях SQL Server и Access (не Oracle) , Postgres, DB2, MySQL, MariaDB и т. Д. И т. Д. И т. П.).

Также математика для вычитания двух значений и проверки на >0 стоит дорого. Просто проверьте, больше ли одно, чем другое.

Наконец, ваше ELSE условие здесь может быть записано как 0 вместо 0 * [Part Assembly Link Table].[QTY], так как все, что 0 равно 0.

Это должно прекрасно работать и в предложении WHERE (хотя я понятия не имею, почему ваш WHERE не удался с самого начала, так что может быть что-то еще).

...