2015-11-19 5 views
1

Я не могу найти, как преобразовать приведенный ниже запрос, написанный в T-SQL, в запрос доступа, который будет использоваться в vba. Я читал, что с использованием IIF вместо CASE (поскольку случай не поддерживается Access SQL), но он пробовал много разных способов и не может заставить его работать.Преобразование CASE в IIF для запроса доступа

sSQL = "SELECT ba.BusinessEntityID,ba.AddressID 
      ,(CASE WHEN ba.BusinessEntityID > 5 
      THEN 
      (SELECT pp.FirstName FROM [Person].[Person] pp 
      WHERE pp.BusinessEntityID = ba.BusinessEntityID) 
      Else 'AA' END) AS 'TEST' 
    FROM Person.BusinessEntityAddress ba 
    INNER JOIN person.AddressType at ON at.AddressTypeID = ba.AddressTypeID 
    WHERE ba.BusinessEntityID < 11;"` 

Я получаю сообщение об ошибке, как следует при попытке запустить приведенный выше запрос ..

Run-Time Error 3075 Ошибка синтаксиса (отсутствующий оператор) в запросе выражения «(случай, когда ба. BusinessEntityID> 5 ТОГДА (SELECT pp.FirstName из [Человек] [Человек] С. ГДЕ pp.BusinessEntityID = ba.BusinessEntityID.) Else 'АА' END) AS 'TEST'

+1

Доступ не принимается 'FROM [Person]. [Person]', 'FROM Person.BusinessEntityAddress' или' FROM person.AddressType'. Используйте только имена таблиц, как они отображаются в Access --- не квалифицируйте имена таблиц с именем схемы или базы данных. – HansUp

+0

Я делаю это через собственный клиент SQL Server 11.0. Я использовал «Установить db = OpenDatabase (« AdventureWorks », False, False, sConnStr)». Я также попытался изменить их на 'FROM [Person]! [Person], FROM [Person]! [BusinessEntityAddress] и FROM [Person]! [AddressType]' – xJustin8

+1

Выполняет ли этот простой запрос тот же контекст, что и запрос вы пытаетесь исправить? 'SELECT ba. * FROM Person.BusinessEntityAddress ba' – HansUp

ответ

0

синтаксис ИМФ:

IIF(condition, if_true_part, if_false_part) 

Кроме того, вы не можете создавать псевдонимы без «AS» в MS Access.

Итак, попробуйте следующий

sSQL = "SELECT ba.BusinessEntityID,ba.AddressID 
      ,IIF(ba.BusinessEntityID > 5 
      ,(SELECT pp.FirstName FROM Person pp 
      WHERE pp.BusinessEntityID = ba.BusinessEntityID) 
      ,'AA') AS 'TEST' 
    FROM BusinessEntityAddress AS ba 
    INNER JOIN AddressType AS at ON at.AddressTypeID = ba.AddressTypeID 
    WHERE ba.BusinessEntityID < 11;" 

Есть 2 другие способы:

1) Для того, чтобы создать функцию VBA, которая будет возвращать "ПгвЬЫате";

2) JOIN (влево или внутренний, что вам нужно) таблица «Person»

+0

спасибо за ответ .. Однако я получаю синтаксическую ошибку в выражении запроса IIF (ba.BusinessEntityID > 5, (SELECT pp.FirstName FROM [Person]! [Person] pp WHERE pp.BusinessEntityID = ba.BusinessEntityID), 'AA') .. Я не могу найти никакой информации, если инструкция IIF поддерживает подзапросы (вот почему я пришел здесь lol). Если нет, можете ли вы показать мне пример, используя ссылку Join, о которой вы упоминали? – xJustin8

+0

1) Вы проверяете имена таблиц? 2) Не забывайте написать «AS»? IIF (....) AS TEST? Я проверил, что подзапросы работают в IIF – 3per

+0

1) Имена таблиц хороши, я тестировал, проверяя sSQL, используя debug, а затем вставляя его в SQL-Server (SSMS). 2) У меня есть AS [TEST], Я даже пробовал AS 'Test' и 'Test' или просто [TEST], все равно не повезло ... – xJustin8

0

При использовании Access, используйте функцию SWITCH: http://www.techonthenet.com/access/functions/advanced/switch.php

части иначе просто сделано, говоря, что условие правда.

sSQL = "SELECT ba.BusinessEntityID, ba.AddressID, 
     SWITCH(ba.BusinessEntityID > 5, 
     (SELECT pp.FirstName FROM [Person].[Person] 
     WHERE pp.BusinessEntityID = ba.BusinessEntityID), 
     TRUE, 'AA') AS 'TEST' 
     FROM Person.BusinessEntityAddress ba 
     INNER JOIN person.AddressType at ON at.AddressTypeID = ba.AddressTypeID 
     WHERE ba.BusinessEntityID < 11" 
+0

Спасибо за ответ .. Тем не менее, я получаю ту же ошибку синтаксиса, что и в моем комментарии выше .. "ошибка в выражении запроса IIF (ba.BusinessEntityID> 5, (SELECT pp.FirstName FROM [Person]! [Person] pp WHERE pp.BusinessEntityID = ba.BusinessEntityID), 'AA') – xJustin8

+0

@ xJustin8 - Этот ответ не содержал в себе 'IIF' ... вы уверены, что скопировали его решение area9? – Hambone

Смежные вопросы