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