VFP sql prepass - PullRequest
       25

VFP sql prepass

0 голосов
/ 28 марта 2012

Понятия не имею, какое у него официальное название, поэтому, может быть, поэтому я ничего не могу найти в Интернете. По сути, когда вы используете sql в vfp, он делает первоначальный проход (иногда 2?) Без перемещения курсора записи или сохранения результатов. К сожалению, в моем sql есть подпрограммы, которые запускаются и меняют вещи во время этого первоначального прохода.

Почему я использую подпрограммы в SQL-запросах? Поскольку vfp не поддерживает ссылки вне подзапроса в выбранных элементах (еще раз, я не знаю официального имени).

Пример: select id, (select detail.name from detail where master.id == detail.id) name from master

Это работает, хотя: select id, getname(id) from master

, где getname() - подпрограмма, содержащая sql из первого примера.

Вы также можете использовать объединение, но приведенное выше является лишь примером, и объединение не работает в моем случае.

Есть ли способ справиться с начальными проходами? Vfp создает логическое значение типа firstpass или что-то в этом роде? Я полагаю, я мог бы добавить счетчик к моей подпрограмме, но это кажется более грязным, чем это уже есть.

В качестве альтернативы кто-то может объяснить или связать мне объяснение с начальным проходом vfp? Я считаю, что раньше он делал только один начальный проход, но теперь он делает два после изменения некоторого кода.

Редактировать: хорошо, я был не прав. Приведенный выше пример работает. Не работает следующее:
SELECT d2.id, (SELECT TOP 1 d1.lname l FROM dpadd d1 WHERE d1.id== d2.id ORDER BY l) FROM dpadd d2
Это дает мне сообщение «SQL: Запросы этого типа не поддерживаются».
Странно это работает, если я делаю следующее:
SELECT d2.id, (SELECT COUNT(d1.lname) FROM dpadd d1 WHERE d1.id == d2.id) FROM dpadd d2

Насчет подпрограмм, это методы моей формы. Базы данных являются локальными файлами .dbf. Я не взаимодействую ни с какими серверами, просто запускаю прямые команды sql с предложениями into cursor и затем генерирую отчеты (обычно).

Я вернусь через несколько минут с действительно полезным оператором select, который "не поддерживается". Я уверен, что вы заметили, что пример top 1 совершенно бесполезен.

1 Ответ

0 голосов
/ 29 марта 2012

Похоже, что TOP не допускается в проекциях.Например, вместо этого вы можете сделать следующее:

SELECT d2.id, (SELECT MAX(d1.lname) l FROM dpadd d1 WHERE d1.id== d2.id) FROM dpadd d2

Что еще вызывает проблемы?

Тамар

...