VFP Найти записи, которые также существуют в другой таблице - PullRequest
0 голосов
/ 25 августа 2018

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

SELECT Account, Common_name FROM Customer;
   WHERE EXISTS (SELECT Account FROM DayB WHERE DayB.Account = Cust.Account) ;
   INTO CURSOR T1

Благодарен за предложения;и можете ли вы порекомендовать простое руководство по SQL.

Спасибо.Andrew

1 Ответ

0 голосов
/ 25 августа 2018

Я думаю, вы поняли ПОЧТИ правильно со скопированным оператором SQL.

SELECT Account, Common_name FROM Customer ;
   WHERE EXISTS (SELECT * FROM DayB WHERE DayB.Account = Customer.Account) ;
   INTO CURSOR T1 ;
   NOFILTER

Здесь вы выбираете 2 поля от клиента (Account и Common_Name). Где часть проверяет, если эти записи клиента также существуют в DayB, в зависимости от общего поля Учетная запись. Cust.Account будет правильным, если вы также будете использовать псевдоним Клиента. то есть:

SELECT Account, Common_name FROM Customer Cust;
   WHERE EXISTS (SELECT * FROM DayB WHERE DayB.Account = Cust.Account) ;
   INTO CURSOR T1 ;
   NOFILTER

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

В проверке EXISTS не важно, что вы выбираете, это может быть Select Account, Select * или даже константа, подобная Select 1. Что бы там ни было, оно все равно не выбрано, предложения EXISTS просто проверяют только существование и возвращают логическое значение.

Наконец, мы добавили NOFILTER в качестве практического правила, чтобы предотвратить фильтрацию строк и создание так называемого «истинного курсора».

Теперь, немного больше учебника. Когда вам нужно проверить строки, которые также существуют в другой таблице, для этого есть в основном 3 конструкции SQL.

СУЩЕСТВУЕТ, как указано выше.

Использование предложения IN:

   SELECT Account, Common_name FROM Customer ;
       WHERE Account in (SELECT Account FROM DayB) ;
       INTO CURSOR T1 ;
       NOFILTER

И ВНУТРЕННЕЕ СОЕДИНЕНИЕ:

SELECT Customer.Account, Customer.Common_name FROM Customer ;
   INNER JOIN DayB ON DayB.Account = Customer.Account ;
   INTO CURSOR T1 ;
   NOFILTER

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

По производительности, EXISTS, вероятно, лучший из них.

...