Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 почему select через in работает, а через inner join - нет?  [new]
CTAC-KO
Member

Откуда: Украина, г. Ивано-Франковск
Сообщений: 1012
привет!
Помогите разобраться в select-ах
не работает:
SELECT ;
     PCs.PCID,;
     PCs.PCName,;
     PCs.ComputerID;
  FROM PCs;
     INNER JOIN curSelectedPCs ON curSelectedPCs.PCID = PCs.PCID ;
  WHERE NOT PCs.Archived ;
  INTO CURSOR curAddablePCs;
  READWRITE 
работает
SELECT ;
     PCs.PCID,;
     PCs.PCName,;
     PCs.ComputerID;
  FROM PCs;
  WHERE NOT PCs.Archived AND PCID NOT in (SELECT PCID FROM curSelectedPCs);
  INTO CURSOR curAddablePCs;
  READWRITE 

я пытаюсь сбиться с NOT in перейдя на INNER JOIN и не получается...

ЗЫ База curSelectedPCs при этом пуста, ее структура аналогична PCs.

thx
23 ноя 06, 10:34    [3439446]     Ответить | Цитировать Сообщить модератору
 Re: почему select через in работает, а через inner join - нет?  [new]
alex11100
Guest
пример, показывающий, как работает иннер джоин

create cursor tt (n i)
for i=1 to 10
insert into tt values (i)
endfor

create cursor pp (n i)
insert into pp values (3)
insert into pp values (5)

select * ;
	from tt ;
		inner join pp on tt.n=pp.n
23 ноя 06, 10:54    [3439615]     Ответить | Цитировать Сообщить модератору
 Re: почему select через in работает, а через inner join - нет?  [new]
Станислав С
Guest
CTAC-KO
привет!
Помогите разобраться в select-ах
не работает:
SELECT ;
     PCs.PCID,;
     PCs.PCName,;
     PCs.ComputerID;
  FROM PCs;
     INNER JOIN curSelectedPCs ON curSelectedPCs.PCID = PCs.PCID ;
  WHERE NOT PCs.Archived ;
  INTO CURSOR curAddablePCs;
  READWRITE 
работает
SELECT ;
     PCs.PCID,;
     PCs.PCName,;
     PCs.ComputerID;
  FROM PCs;
  WHERE NOT PCs.Archived AND PCID NOT in (SELECT PCID FROM curSelectedPCs);
  INTO CURSOR curAddablePCs;
  READWRITE 

я пытаюсь сбиться с NOT in перейдя на INNER JOIN и не получается...

ЗЫ База curSelectedPCs при этом пуста, ее структура аналогична PCs.

thx

Так ты делаешь совершенно разные запросы:
Первый: объединить таблицы по условию: curSelectedPCs.PCID = PCs.PCID , наложить фильтр NOT PCs.Archived и вывести в кусор поля <список полей>

Второй: из таблицы РCs иыбрать данные по условию: "PCs.PCID не встречается в наборе значений curSelectedPCs.PCID", наложить фильтр NOT PCs.Archived и вывести в кусор поля <список полей>

Кроме того, при пустой базе curSelectedPCs какой может быть набор записей по условию "curSelectedPCs.PCID = PCs.PCID"? Правильно - пустой! А по условию "PCs.PCID не встречается в наборе значений curSelectedPCs.PCID"? Правильно - весь файл PCs!

Надо правильно формулировать запросы...
23 ноя 06, 10:57    [3439641]     Ответить | Цитировать Сообщить модератору
 Re: почему select через in работает, а через inner join - нет?  [new]
CTAC-KO
Member

Откуда: Украина, г. Ивано-Франковск
Сообщений: 1012
вот от тебя-то я и ожидал ответа :)

получается что иннером такого эхвекту не добицца? т.е. в твоем примере в выборке остались тока те записи, которые были в обоих базах. типа аналог если бы было IN без NOT. т.е. в моем случае сработает тока NOT IN ?
23 ноя 06, 11:15    [3439782]     Ответить | Цитировать Сообщить модератору
 Re: почему select через in работает, а через inner join - нет?  [new]
CTAC-KO
Member

Откуда: Украина, г. Ивано-Франковск
Сообщений: 1012
Станислав С

Так ты делаешь совершенно разные запросы:
Первый: объединить таблицы по условию: curSelectedPCs.PCID = PCs.PCID , наложить фильтр NOT PCs.Archived и вывести в кусор поля <список полей>

Второй: из таблицы РCs иыбрать данные по условию: "PCs.PCID не встречается в наборе значений curSelectedPCs.PCID", наложить фильтр NOT PCs.Archived и вывести в кусор поля <список полей>

Кроме того, при пустой базе curSelectedPCs какой может быть набор записей по условию "curSelectedPCs.PCID = PCs.PCID"? Правильно - пустой! А по условию "PCs.PCID не встречается в наборе значений curSelectedPCs.PCID"? Правильно - весь файл PCs!

Надо правильно формулировать запросы...
сенксь - похоже до меня доходит по-маленьку :)
23 ноя 06, 11:18    [3439812]     Ответить | Цитировать Сообщить модератору
 Re: почему select через in работает, а через inner join - нет?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Добиться-то можно, только на скорость это никак не скажется. IN - проще и понятнее. Можно через EXISTS еще сделать. Если делать через JOIN, то это будет LEFT JOIN. Примерно так:

SELECT ;
	PCs.PCID, ;
	PCs.PCName, ;
	PCs.ComputerID ;
FROM PCs ;
LEFT JOIN curSelectedPCs ON curSelectedPCs.PCID = PCs.PCID ;
WHERE ;
	PCs.Archived = .F. ;
	AND IsNull(curSelectedPCs.PCID) = .T. ;
INTO CURSOR curAddablePCs READWRITE

PS: А кто-то еще утверждал, что Select-SQL - это просто
23 ноя 06, 11:21    [3439850]     Ответить | Цитировать Сообщить модератору
 Re: почему select через in работает, а через inner join - нет?  [new]
CTAC-KO
Member

Откуда: Украина, г. Ивано-Франковск
Сообщений: 1012
ВладимирМ
Добиться-то можно, только на скорость это никак не скажется. IN - проще и понятнее. Можно через EXISTS еще сделать. Если делать через JOIN, то это будет LEFT JOIN. Примерно так:

SELECT ;
	PCs.PCID, ;
	PCs.PCName, ;
	PCs.ComputerID ;
FROM PCs ;
LEFT JOIN curSelectedPCs ON curSelectedPCs.PCID = PCs.PCID ;
WHERE ;
	PCs.Archived = .F. ;
	AND IsNull(curSelectedPCs.PCID) = .T. ;
INTO CURSOR curAddablePCs READWRITE

PS: А кто-то еще утверждал, что Select-SQL - это просто
даже не знаю кто такое мог утверждать :)
что до примера, приведенног Вами, то действительно мне этот IN как-то сразу по-душе пришелся и понятнее мне конструкция с ним, нежели оная из примера... а уж если такой гуру-лисовод утверждает что по скорости нет разницы - то и вовсе нет причин для беспокойств :)

Всем спасибо за ответы!
23 ноя 06, 11:56    [3440222]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить