|
|
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
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 независимо от того есть ли привязка к справочникам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 12:14:13 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. Правда, если связь вида много-ко-многим, хотя бы по одному справочнику, то будет много "мусора" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 12:45:11 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Код: plaintext 1. 2. 3. 4. Правда, если связь вида много-ко-многим, хотя бы по одному справочнику, то будет много "мусора" Это относися не только в внешнему (LEFT, RIGHT, FULL), но и в внутреннему (INNER) объединениям. :) С Уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 13:07:20 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
Благодарю за содействие!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 13:30:09 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
то ВладимирМ 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 15:35:29 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
Я же сказал, если у тебя на одну запись главной таблицы приходится несколько записей в подчиненной, то ты получишь задвоение данных. При этом, как справедливо заметил 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. А вот теперь, смотри что имеем в результате: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Понятно что получилось? Чтобы обеспечить объединение таблиц по коду 1 первую запись главной таблицы пришлось "размножить". Если сделать еще дублирующую запись с кодом 1 в главной таблицы, то общее количество записей с кодом 1 - это произведение количества записей главной таблицы с этим кодом на количество записей в подчиненной таблице с этим же кодом. Т.е. прежде чем выполнять объединение таблиц надо убедиться, что во всех подчиненных таблицах есть только по одной записи с кодом, по которому производиться объединение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 15:46:07 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
У меня записи в справочниках имеют уникальные - неповторяющиеся значения, задвоенность исключается. Единственное, в главной базе поля, которые ссылаются к справочнику могут быть пустыми. Меня смущает построение команд при перечислении 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 ...=...; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 15:59:29 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 16:30:33 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
Тогда я не могу понять почему из 3 записей основной базы запрос выводит 7 записей, в справочниках нет повторяемых значений, и все сделано по Вашему руководству. Пояснение: Основная база и 7 справочников, с простой структурой npp | numeric | 8 naim | symbol | 30 Может у Вас другой был бы подход к выборке, может есть другие способы по проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 16:42:09 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
Приведи пример таблиц с заполненными данными. Какой запрос выполнил, что получил и что ожидал получить. А то, так еще долго будет выяснять что к чему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 17:05:07 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
ВладимирМПриведи пример таблиц с заполненными данными. Какой запрос выполнил, что получил и что ожидал получить. А то, так еще долго будет выяснять что к чему. Прошу прощения, но меня посадят если дам свои базы данных, это сов.сек. иначе выложил бы все без остатка :( А так, образно помоему я основу предоставил Вам. Кстати как на счет смены работы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 17:28:11 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
А distinct не пробовали поставить ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 18:08:38 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
For Peace...это сов.сек... Поменяй "Иванов" на "Петров" и всё будет ОК! ;-) Или у тебя сама структура "сов. сек."? :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 18:55:14 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
Hi For Peace! Никому не интересны твои секреты - сделай АБСТРАКТНЫЙ пример (например с целыми числами, и/или буквами любого алфавита) и потестируй - практически уверен, что ты тогда и сам поймёшь в чём дело... Главное выявить имеющиеся у тебя "ситуации" т.е. отсутствие в справочнике записей с какими-то кодами, наличие дубликатов кодов в справочнике, наличие в основной таблице NULL значений в полях внешнего ключа и т.п. "На пальцах" работа JOIN-ов расписывалась неоднократно. Кстати в VFP6 имеет место ошибка - если используются совместно внешние объединения И в условии конструкции типа db2.someField IS NULL или NVL(db2.SomeField) - в 7-ке это частично починили (но наличие индексов может опять таки приводить к "странным" результатам) в 8-ке вроде окончательно забороли... Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 00:07:52 |
|
||
|
Left inner - Right inner (деградирую понемногу- вопрос элементарный, просто нет времени)
|
|||
|---|---|---|---|
|
#18+
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. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Комментарий: INNER JOIN - создает объединение, в котором вибираются только те записи, которые содержат совпадающие значения в полях связи. LEFT JOIN - создает объединение, в котором вибираются все записи из левой таблицы, а также соответствующие записи из правой таблицы, если нет соответствия, то заполняется значением NULL. RIGHT JOIN - создает объединение, в котором вибираются все записи из правой таблицы, а также соответствующие записи из левой таблицы, если нет соответствия, то заполняется значением NULL. FULL JOIN - создает объединение, в котором выбираются все записи из правой и левой таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 07:50:40 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33317799&tid=1593295]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 203ms |
| total: | 373ms |

| 0 / 0 |
