powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
16 сообщений из 16, страница 1 из 1
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33316949
For Peace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFP6
выборка запросом основной базы bd с дюжины справочников (bd2,bd3 и т.д.)т.е.
обычный SQL- select

Select * from a bd1,b bd2,c bd3 where bd1.bd2=bd2.npp and bd1.bd3=bd3.npp into cursor

В этом случае как Вы знаете будут выбираться только те записи, которые по будут удовлетворяться условию where, а требуется выбор всех записей c bd

Напомните пожалуйста, как используется Left inner и right inner в запросах в данном примере, чтобы выбирались все записи с Bd независимо от того есть ли привязка к справочникам
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33317091
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
SELECT bd.* ;
FROM bd ;
LEFT JOIN bd2 ON bd1.bd2=bd2.npp ;
LEFT JOIN bd3 ON bd1.bd3=bd3.npp 

Правда, если связь вида много-ко-многим, хотя бы по одному справочнику, то будет много "мусора"
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33317206
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
Код: plaintext
1.
2.
3.
4.
SELECT bd.* ;
FROM bd ;
LEFT JOIN bd2 ON bd1.bd2=bd2.npp ;
LEFT JOIN bd3 ON bd1.bd3=bd3.npp 

Правда, если связь вида много-ко-многим, хотя бы по одному справочнику, то будет много "мусора"
Это относися не только в внешнему (LEFT, RIGHT, FULL), но и в внутреннему (INNER) объединениям. :)
С Уважением, Алексей.
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33317296
For Peace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю за содействие!!!
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33317753
For Peace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то ВладимирМ

SELECT bd.* ;
FROM bd ;
LEFT JOIN bd2 ON bd1.bd2=bd2.npp ;
LEFT JOIN bd3 ON bd1.bd3=bd3.npp

выводит больше записей чем в bd1
может както по другому типа

SELECT bd.* ;
FROM bd ;
LEFT JOIN bd2 ;
LEFT JOIN bd3 ;
ON bd1.bd3=bd3.npp ;
ON bd1.bd2=bd2.npp
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33317799
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же сказал, если у тебя на одну запись главной таблицы приходится несколько записей в подчиненной, то ты получишь задвоение данных. При этом, как справедливо заметил Aleksey-K , абсолютно не важно, как именно ты объединяешь таблицы, LEFT или INNER JOIN (или в WHERE)

Тестовые таблички
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
* Главная таблица  
  CREATE CURSOR tabMain (tabMainID I, NickName C( 50 ))    
  INSERT INTO tabMain (tabMainID, NickName) VALUES ( 1 , "Первая запись главной таблицы")    
  INSERT INTO tabMain (tabMainID, NickName) VALUES ( 2 , "Вторая запись главной таблицы")    
  INSERT INTO tabMain (tabMainID, NickName) VALUES ( 3 , "Третья запись главной таблицы")    
    
 * Подчиненная таблица  
 * Для первой записи главной таблицы есть дублирующее значение по максимальной дате  
 * Для второй записи главной таблицы вообще нет значений в подчиненной таблице  
  CREATE CURSOR tabChild (tabChildID I, tabMainID I, CurDate D, NickName C( 50 ))    
  INSERT INTO tabChild (tabChildID, tabMainID, CurDate, NickName) ;  
  	VALUES ( 1 ,  1 , DATE( 2005 , 6 , 15 ), "Первая запись дочерней первой записи главной")  
  INSERT INTO tabChild (tabChildID, tabMainID, CurDate, NickName) ;  
  	VALUES ( 2 ,  1 , DATE( 2005 , 6 , 15 ), "Вторая запись дочерней первой записи главной")  
  INSERT INTO tabChild (tabChildID, tabMainID, CurDate, NickName) ;  
  	VALUES ( 3 ,  1 , DATE( 2005 , 6 , 10 ), "Третья запись дочерней первой записи главной")  
  INSERT INTO tabChild (tabChildID, tabMainID, CurDate, NickName) ;  
  	VALUES ( 4 ,  3 , DATE( 2005 , 6 , 13 ), "Первая запись дочерней третьей записи главной")  
  INSERT INTO tabChild (tabChildID, tabMainID, CurDate, NickName) ;  
  	VALUES ( 5 ,  3 , DATE( 2005 , 6 , 14 ), "Первая запись дочерней третьей записи главной")

А вот теперь, смотри что имеем в результате:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
* объединение по LEFT JOIN
SELECT tabMain.*, tabChild.* ;
FROM tabMain ;
LEFT JOIN tabChild ON tabMain.tabMainID=tabChild.tabMainID

* объединение по INNER JOIN или WHERE tabMain.tabMainID=tabChild.tabMainID
SELECT tabMain.*, tabChild.* ;
FROM tabMain ;
INNER JOIN tabChild ON tabMain.tabMainID=tabChild.tabMainID

Понятно что получилось? Чтобы обеспечить объединение таблиц по коду 1 первую запись главной таблицы пришлось "размножить".

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

Т.е. прежде чем выполнять объединение таблиц надо убедиться, что во всех подчиненных таблицах есть только по одной записи с кодом, по которому производиться объединение.
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33317847
For Peace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня записи в справочниках имеют уникальные - неповторяющиеся значения, задвоенность исключается. Единственное, в главной базе поля, которые ссылаются к справочнику могут быть пустыми.

Меня смущает построение команд при перечислении

Left join ... on ...=...; (1)
Left join ... on ...=...; (2)
Left join ... on ...=... (3)


Не будет ли вторая строка (2) уже стать ''левым подключением" к (1) строке
а (3) строка к (2) строке

в учебнике на примере так оформлено
Left join
Left join
Left join
... on ...=...;
... on ...=...;
... on ...=...;
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33317930
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For PeaceУ меня записи в справочниках имеют уникальные - неповторяющиеся значения, задвоенность исключается. Единственное, в главной базе поля, которые ссылаются к справочнику могут быть пустыми.

Меня смущает построение команд при перечислении

Left join ... on ...=...; (1)
Left join ... on ...=...; (2)
Left join ... on ...=... (3)

Это корректный синтаксис для FoxPro.

For PeaceНе будет ли вторая строка (2) уже стать ''левым подключением" к (1) строке а (3) строка к (2) строке
Насчет кто к кому "подключается", то здесь другая логика.

Начать нужно с того, что собственно делает объединение по INNER JOIN. Любой вид объединения (LEFT, RIGHT, FULL) в отношении записей удовлетворяющих условию объединения работает абсолютно также.

Разные виды объединений (INNER, LEFT, RIGHT, FULL) определяют, что нужно делать с теми записями, которые НЕ удовлетворяют условию объединения.

Т.е. можно сказать так:

Сначала выполняется объединение по INNER JOIN, а потом к итоговому результату "довешиваются" записи НЕ удовлетворяющие условию объединения в соответствии с указанным правилом (LEFT, RIGHT, FULL)

Поэтому, абсолютно не важно в какой последовательности будут расположены LEFT JOIN. (1), (2), (3) или (1), (3), (2) или (3), (1), (2) на результат это никак не повлияет.

For Peace
в учебнике на примере так оформлено
Left join
Left join
Left join
... on ...=...;
... on ...=...;
... on ...=...;
О каком учебнике идет речь? Приведенный синтаксис - это ошибка. Результат будет не предсказуемый.

Именно из-за этой ошибки практически невозможно построить корректные объединения в дизайнере Query или Local View. Приходится либо отказываться от "лишних" таблиц, либо строить Local View "вручную" через CREATE SQL VIEW
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33317972
For Peace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда я не могу понять почему из 3 записей основной базы запрос выводит 7 записей, в справочниках нет повторяемых значений, и все сделано по Вашему руководству.

Пояснение: Основная база и 7 справочников, с простой структурой
npp | numeric | 8
naim | symbol | 30

Может у Вас другой был бы подход к выборке, может есть другие способы по проще?
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33318053
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведи пример таблиц с заполненными данными. Какой запрос выполнил, что получил и что ожидал получить. А то, так еще долго будет выяснять что к чему.
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33318082
For Peace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМПриведи пример таблиц с заполненными данными. Какой запрос выполнил, что получил и что ожидал получить. А то, так еще долго будет выяснять что к чему.

Прошу прощения, но меня посадят если дам свои базы данных, это сов.сек.
иначе выложил бы все без остатка :(

А так, образно помоему я основу предоставил Вам. Кстати как на счет смены работы?
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33318207
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А distinct не пробовали поставить ?
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33318311
Komissar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For Peace...это сов.сек...
Поменяй "Иванов" на "Петров" и всё будет ОК! ;-)
Или у тебя сама структура "сов. сек."? :-)))
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33318615
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi For Peace!

Никому не интересны твои секреты - сделай АБСТРАКТНЫЙ пример (например с
целыми числами, и/или буквами любого алфавита) и потестируй - практически
уверен, что ты тогда и сам поймёшь в чём дело... Главное выявить имеющиеся у
тебя "ситуации" т.е. отсутствие в справочнике записей с какими-то кодами,
наличие дубликатов кодов в справочнике, наличие в основной таблице NULL
значений в полях внешнего ключа и т.п.
"На пальцах" работа JOIN-ов расписывалась неоднократно. Кстати в VFP6 имеет
место ошибка - если используются совместно внешние объединения И в условии
конструкции типа db2.someField IS NULL или NVL(db2.SomeField) - в 7-ке это
частично починили (но наличие индексов может опять таки приводить к
"странным" результатам) в 8-ке вроде окончательно забороли...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33318734
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For PeaceVFP6
выборка запросом основной базы bd с дюжины справочников (bd2,bd3 и т.д.)т.е.
обычный SQL- select

Select * from a bd1,b bd2,c bd3 where bd1.bd2=bd2.npp and bd1.bd3=bd3.npp into cursor

Напомните пожалуйста, как используется Left inner и right inner в запросах в данном примере, чтобы выбирались все записи с Bd независимо от того есть ли привязка к справочникам
Если немного изменить пример Владимира Максимова :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
* Главная таблица  
  CREATE CURSOR tbMain (tbID I, NickName C( 50 ))    
  INSERT INTO tbMain (tbID, NickName) VALUES ( 1 , "Первая запись главной таблицы")    
  INSERT INTO tbMain (tbID, NickName) VALUES ( 2 , "Вторая запись главной таблицы")    
  INSERT INTO tbMain (tbID, NickName) VALUES ( 3 , "Третья запись главной таблицы")    

* Главная таблица   1 
  CREATE CURSOR tbMain1 (tbID I, NickName C( 50 ))    
  INSERT INTO tbMain1 (tbID, NickName) VALUES ( 1 , "Первая запись главной таблицы 1")    
  INSERT INTO tbMain1 (tbID, NickName) VALUES ( 2 , "Вторая запись главной таблицы 1")    
  INSERT INTO tbMain1 (tbID, NickName) VALUES ( 3 , "Третья запись главной таблицы 1")    

 * Подчиненная таблица  
  CREATE CURSOR tbChild (tbCID I, tbID1 I, tbID2 I, CurDate D, NickName C( 50 ))    
  INSERT INTO tbChild (tbCID, tbID1, tbID2, CurDate, NickName) ;  
  	VALUES ( 1 ,  1 ,  1 , DATE( 2005 , 6 , 15 ), "Первая запись дочерней")  
  INSERT INTO tbChild (tbCID, tbID1, tbID2, CurDate, NickName) ;  
  	VALUES ( 2 ,  1 ,  2 , DATE( 2005 , 6 , 15 ), "Вторая запись дочерней")  
  INSERT INTO tbChild (tbCID, tbID1, tbID2, CurDate, NickName) ;  
  	VALUES ( 3 ,  2 ,  3 , DATE( 2005 , 6 , 10 ), "Третья запись дочерней")  
  INSERT INTO tbChild (tbCID, tbID1, tbID2, CurDate, NickName) ;  
  	VALUES ( 4 ,  3 ,  1 , DATE( 2005 , 6 , 13 ), "Четвертая запись дочерней")  
  INSERT INTO tbChild (tbCID, tbID1, tbID2, CurDate, NickName) ;  
  	VALUES ( 5 ,  3 ,  2 , DATE( 2005 , 6 , 14 ), "Пятая запись дочерней")
Т.е. применим связь много к одному, что по моему и желает For Peace
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT tbMain.*, tbMain1.*, tbChild.* ;
FROM tbChild ;
LEFT JOIN tbMain ON tbChild.tbID1=tbMain.tbID;
LEFT JOIN tbMain1 ON tbChild.tbID2=tbMain1.tbID;
INTO CURSOR Q_left1
SELECT tbMain.*, tbMain1.*, tbChild.* ;
FROM tbChild ;
INNER JOIN tbMain ON tbChild.tbID1=tbMain.tbID;
INNER JOIN tbMain1 ON tbChild.tbID2=tbMain1.tbID;
INTO CURSOR Q_inner
SELECT tbMain.*, tbMain1.*, tbChild.* ;
FROM tbChild, tbMain, tbMain1 ;
WHERE tbChild.tbID1=tbMain.tbID;
  AND tbChild.tbID2=tbMain1.tbID;
INTO CURSOR Q_where
Т.е. заметим результат один и тот же.
Комментарий:
INNER JOIN - создает объединение, в котором вибираются только те записи, которые содержат совпадающие значения в полях связи.
LEFT JOIN - создает объединение, в котором вибираются все записи из левой таблицы, а также соответствующие записи из правой таблицы, если нет соответствия, то заполняется значением NULL.
RIGHT JOIN - создает объединение, в котором вибираются все записи из правой таблицы, а также соответствующие записи из левой таблицы, если нет соответствия, то заполняется значением NULL.
FULL JOIN - создает объединение, в котором выбираются все записи из правой и левой таблицы.
...
Рейтинг: 0 / 0
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
    #33319029
For Peace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всех благодарствую!!!!

Вопрос решен, я восхищен Вашим альтруизмом, всем еще раз СПАСИБО!!!
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]