Внешние объединения (OUTER JOIN) в FoxPro SELECT
http://www.patriot.net/users/johnson/html/neil/fox
Я сдаюсь. Я прочитал чертову документацию - ничего! С
использованием команды SELECT мне нужно объединить две таблицы A
и B, и если поля не совпадают, поместить пустые значения в поля,
полученные из таблицы B. В предыдущих версиях FoxPro я мог бы
использовать SET RELATION TO и получил бы требуемое. Хотя нет,
это получается LEFT OUTER JOIN! Для получения такого результата
мы не можем использовать стандартные средства FoxPro. Нам нужно
использовать объединение (UNION) двух команд SELECT: одна выборка
включает все записи с соответствием в таблице B, а другая - для
всех записей, не имеющих соответствия.
Вот пример:
SELECT a.keyfield, ; a.datafield1, ; b.datafield2, ; b.datafield3 ; FROM a,b ; WHERE a.keyfield = b.keyfield ; UNION ; SELECT a.keyfield, ; a.datafield1, ; 000.00, ; 000.00 ; FROM a ; WHERE a.keyfield NOT IN ; (SELECT b.keyfield ; FROM b)Пара замечаний:
1. Численные и строковые константы во второй выборке (000.00 в нашем примере) должны в точности соответствовать длине полей второй таблицы, так как FoxPro требует, чтобы структуры таблиц по обе стороны UNION в точности совпадали.
2. SET RELATION TO и SET SKIP TO могут работать быстрее, если это не очень сложный запрос.
Копирование содержимого поля в BROWSE в буфер обмена
lcdbf=ALIAS() lcfield=VARREAD() lcvar=lcdbf+'.'+lcfield _CLIPTEXT = &lcvar
Выбор повторяющихся записей из таблицы
SELECT * ; FROM mydbf d1 ; WHERE EXISTS ; ( SELECT * ; FROM mydbf d2 ; WHERE d2.keyfield = d1.keyfield ; GROUP BY keyfield ; HAVING COUNT(*) > 1 ) ; ORDER BY keyfieldlistили:
SELECT * ; FROM mydbf ; WHERE keyfield IN ; ( SELECT keyfield ; FROM dbf ; GROUP BY keyfield ; HAVING count(*) > 1) ; ORDER BY keyfieldlist
Макросы: символ-терминатор
При обработке макрокоманд FoxPro считает, что первая точка после переменной, включенной в макро, служит сигналом для удаления финальных пробелов. Следовательно: &m.filter работать не будет, так как `.' является терминатором.
SELECT &XXXX.field FROM &XXXXтакже не работает, но может быть исправлена на:
SELECT &XXXX..subsystem FROM &XXXX * обратите внимание на две точки