Внешние объединения (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 * обратите внимание на две точки