Что не так с этим запросом SQL? - PullRequest
1 голос
/ 27 августа 2010

Это SQL-запрос, который я написал в MS Access 07:

IF EXISTS (Select * FROM MyTable) print 'Yes' else print 'No'

Это ошибка, которую выдает мне при выполнении запроса:

"Неверный SQL Statemenet; Ожидаемое УДАЛЕНИЕ, ВСТАВКА, ПРОЦЕДУРА, ВЫБОР, ОБНОВЛЕНИЕ "

Запрос правильный, насколько я знаю, я думаю, что это из Access, может кто-нибудь помочь мне, пожалуйста?Спасибо

Ответы [ 8 ]

4 голосов
/ 27 августа 2010

Вы не можете использовать IF EXISTS в Access. EXISTS () допускается, но только как оценочное выражение, а не как процедурное. Выражение EXISTS () возвращает True или False (в форме -1 и 0).

Представьте, что вы могли бы использовать процедурное выражение ... где вы пытаетесь напечатать результат? Нет места для вывода результатов печати. ​​

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

Если предположить, что вы хотите, чтобы запрос возвращал «Да» или «Нет», то это может сделать это для вас:

SELECT Iif(EXISTS (SELECT * FROM MyTable), "Yes", "No") AS MyTableHasRows
FROM Numbers
WHERE Num = 1;

Однако здесь есть проблема: Access не допускает операторов SELECT, которые не ссылаются на таблицу. (SQL Server позволяет это, и Oracle предлагает выбрать поддельную таблицу DUAL.) Одним из способов решения этой проблемы является выбор из таблицы, которая имеет только одну строку. Мой запрос выше выбирает из таблицы чисел, которая находится в моей тестовой базе данных, где только одна строка имеет Num = 1. Выбор из таблицы с множеством строк заставляет двигатель выполнять дополнительную работу без всякой причины.

Если вы хотите выполнить эту проверку в коде, вот наиболее эффективный способ, который я могу себе представить:

If CurrentDb().OpenRecordset("SELECT Top 1 * FROM MyTable").RecordCount > 0 Then
   Debug.Print "Yes"
Else
   Debug.Print "No"
End If

Это логически идентично EXISTS и будет работать лучше, чем COUNT (*), который должен просматривать каждую строку в таблице.

2 голосов
/ 27 августа 2010

IF EXISTS нельзя использовать в MS Access.

Взгляните на эту ссылку , это может быть то, что вам нужно.

1 голос
/ 27 августа 2010

Если вы хотите узнать, есть ли в таблице записи, вы можете проверить CurrentDB.TableDefs ("MyTable"). Recordcount.Это никогда не будет 0 для таблицы с записями в ней.

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

0 голосов
/ 27 августа 2010

Несколько баллов:

  1. Access SQL использует iif(), а не IF
  2. Access SQL не использует EXISTS
    Редактировать
    На самом деле это работает, хотя я не смог найти его в файлах справки. Это отлично работает:
    Select (IIf(Exists (SELECT 1 FROM [Table1]),'Y','N')) as A from [Table1];
    / Edit
  3. DCount является ключом:
    iif(<br> DCount("AnyFieldName","TableName")>0,<br> "Yes",<br> "No"
  4. Я предлагаю добавить этот сайт в закладки для дальнейшего использования. Действительно полезно.
    http://www.techonthenet.com/access/functions/
  5. Файлы справки Access на самом деле довольно полезны и просты. Они описывают параметры, вывод, приводят примеры и т. Д. Я рекомендую часто их использовать.
0 голосов
/ 27 августа 2010

Как говорили другие до меня, Access не знает, если существует.
Вы можете сделать что-то подобное в VBA:

Public Sub Foo()

    If Not IsNull(DLookup("SomeColumn", "MyTable")) Then
        MsgBox "yes"
    Else
        MsgBox "no"
    End If

End Sub
0 голосов
/ 27 августа 2010

Я понятия не имею о MS Access, но как насчет следующего:

IF SELECT EXISTS (SELECT 1 FROM mytable WHERE somecondition) THEN...

Сообщение об ошибке «Неверный SQL Statemenet; Ожидаемый DELETE, INSERT, PROCEDURE, SELECT, UPDATE» предполагает, что вы пропустилииз тех.Вам нужно выбрать EXISTS, а не просто вызывать EXISTS.

Это работает в PostgreSQL, но я не уверен, если Access отличается.

0 голосов
/ 27 августа 2010

Насколько я знаю: Access имеет облегченную версию из SQL.Вы не сможете использовать TSQL.Вы можете попробовать использовать VBA для достижения того, что вы хотите.

0 голосов
/ 27 августа 2010

Возможно, вам нужен BEGIN - END.

ОБНОВЛЕНИЕ: Извините, что предъявил плохие новости .

http://www.experts -exchange.com / Microsoft / Разработка / MS_Access / Q_22102849.html

Похоже, MS Access не контролирует выполнение потока в своем синтаксисе SQL. Он выполняет только одну команду. (по ссылке выше)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...