|
|
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
Леди и джентельмены! Искренне прошу прощения за свой очень простой вопрос. Пример: Tab1: nId, cRegNomer (12) Tab2: nId, cDelNomer (12) Нужно выбрать те записи из Tab1, которые по Tab1.cRegNomer совпадают с Tab2.cDelNomer. Пишу: Код: plaintext Код: plaintext Подскажите, что далаю не так. Благодарю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 14:55:29 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
ЛисонькаЛеди и джентельмены! Искренне прошу прощения за свой очень простой вопрос. Пример: Tab1: nId, cRegNomer (12) Tab2: nId, cDelNomer (12) Нужно выбрать те записи из Tab1, которые по Tab1.cRegNomer совпадают с Tab2.cDelNomer. Пишу: Код: plaintext Код: plaintext Подскажите, что далаю не так. Благодарю Если я понял правильно, то можно так: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 15:00:51 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
ЛисонькаЛеди и джентельмены! Искренне прошу прощения за свой очень простой вопрос. Пример: Tab1: nId, cRegNomer (12) Tab2: nId, cDelNomer (12) Нужно выбрать те записи из Tab1, которые по Tab1.cRegNomer совпадают с Tab2.cDelNomer. Пишу: Код: plaintext Код: plaintext Подскажите, что далаю не так. Благодарю Хотя, можно и так. Только подправить чуть-чуть: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 15:06:22 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
Ну и так можешь: SELECT Tab1.nId, Tab1.cRegNomer FROM Tab1 INNER JOIN Tab2 ON Tab1.cRegNomer =Tab2.cDelNomer INTO CURSOR tmp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 16:14:42 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
На данном сайте есть книга Понимание SQL (Understanding SQL) Почитай там главу 8. Запрос многих таблиц как одной Правда, там нет объединения по JOIN, но в остальном вполне можно использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 16:55:02 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
ВладимирМНа данном сайте есть книга Понимание SQL (Understanding SQL) Почитай там главу 8. Запрос многих таблиц как одной Правда, там нет объединения по JOIN, но в остальном вполне можно использовать. Спасибо, эту книгу мне летом уже переслал один знакомый по e-mail, начала читать и забросила - некогда. Нужно начинать ее заново. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 17:10:08 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
Так, джентельмены, позвольте доложить о моих результатах. В Tab1 у меня около 20 000 записей, в Tab2 - более 82 000. Код: plaintext Код: plaintext Код: plaintext М-да-а... Моих 8 свободных гигов на С явно оказалось маловато. Интересно было бы взглянуть, чего же он там понавыбирал? ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 17:46:37 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
бест регардз любителям селектов на больших файловых таблицах лисонька а ты еще по 10мбитной сетке (вот и плюются делфисты и им подобные на фокс, когда насмотрятся таких извращений) зато селекта, круто аж жуть так держать!!!! только что разговор на энту тему в фоксклабе был ручками попроще и пошустрее будет или в SQL все во поизголялся- злой я, покусаю всех, пойду чай с мурмурладом попью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 18:16:02 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
видима у тебя очень много полей с пустым (или одинаковым) значением cRegNomer и cDelNomer. Отсюдова получаеца, што во 2 и 3 случаях декартово произведение выходит за рамку свободного места на винте а в первом - то множество одинаковых значений не эту образует матрицу.. ЗЫ видима ответил непонятна ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 18:18:33 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
2 alex11100 извини конешна, но ты как в лужу п:ернул со своим трейдом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 18:20:54 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
alex11100бест регардз любителям селектов на больших файловых таблицах лисонька а ты еще по 10мбитной сетке (вот и плюются делфисты и им подобные на фокс, когда насмотрятся таких извращений) зато селекта, круто аж жуть так держать!!!! только что разговор на энту тему в фоксклабе был ручками попроще и пошустрее будет или в SQL все во поизголялся- злой я, покусаю всех, пойду чай с мурмурладом попью Эта роль ругательная и прошу ко мне ее не применять! Или сочувственная? ;-)))))) Короче говоря, лучше бы я пошла через SCAN... LOCATE (SEEK)... IF FOUND()=.T. ... ENDSCAN и не мучала себя в данном случае запросом? Проверила получившуюся выборку. В нее помимо нужного попали еще записи с пустым значением Tab1.cRegNomer. Приписала еще тогда условие AND Tab1.cRegNomer# ' '. Пуснтые значения из выборки исчезли, но зато попало несколько записей с длиной Tab1.cRegNomer в 1 символ (без концевых пробелов). Почему так получается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 18:27:21 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
Hel!Riserвидима у тебя очень много полей с пустым (или одинаковым) значением cRegNomer и cDelNomer. Отсюдова получаеца, што во 2 и 3 случаях декартово произведение выходит за рамку свободного места на винте а в первом - то множество одинаковых значений не эту образует матрицу.. ЗЫ видима ответил непонятна Точно! Соотношение пустых значений к непустым 10 : 1. Декартово произведение? Что-то проходили лет 8 назад в институте. Или нет? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 18:30:48 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
[quot Лисонька Приписала еще тогда условие AND Tab1.cRegNomer# ' '. Пуснтые значения из выборки исчезли, но зато попало несколько записей с длиной Tab1.cRegNomer в 1 символ (без концевых пробелов). Почему так получается?[/quot] AND !EMPTY(Tab1.cRegNomer) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 18:32:14 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
ЛисонькаЧто-то проходили лет 8 назад в институте. Или нет? ага. уже слово больно красивое. Решил выпиндрица ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 18:35:43 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
Да, кое-что вспомнила про декартово произведение. Что-то про все возможные табличные строки, сцепленные там еще с чем-то. Повторю слова Кэролловской Алисы: "Как все это сложно и непонятно!" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 19:12:37 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
SELECT nId, cRegNomer FROM Tab1 WHERE Tab1.cRegNomer in (select distinct cDelNomer from Tab2) INTO CURSOR tmp IMHO Посмотри ? SET('delete') если включено, тогда может помочь установка индекса по DELETE На относительно больших объемах помогает. У меня запрос из 4-ех таблиц, два справочника и две таблицы больше 1мл. записей, при индексировании по "DEL" в таблицах данных, запрос стал работать быстрее процентов на 40. Опять же, если выставлял индекс по "DEL" в таблицах-справочников, тогда запрос выполнялся медленней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 19:36:31 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
Лисонька! А может, тебе надо всего-то: Код: plaintext 1. 2. А то наворотили тут, понимаешь ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 20:56:39 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
Тренироваться лучше "на кошечках". В смысле, сделать тестовые курсоры и смотреть что получиться. В общем случае IN и INNER JOIN вовсе не равнозначны. Вот пример для опытов. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Некоторые пояснения. Я использую конструкцию WHERE tab1.cRegNomer<>SPACE(12), а не !EMPTY(tab1.cRegNomer), потому, что SPACE(12) будет использовать существующий индекс (т.е. запрос оптимизируется или ускоряется), а EMPTY() - не будет. Как видно по результату, при использовании IN будет отбираться не более одной записи из таблицы tab1 на каждую найденную запись из таблицы tab2, а при использовании INNER JOIN получишь произведение найденных записей d tab1 и tab2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 21:48:58 |
|
||
|
Написала чушь в запросе. Помогите научиться
|
|||
|---|---|---|---|
|
#18+
Hi Лисонька! 1) Если в tab2 будет 10 записей с одним и тем-же кодом, и в tab1 будет 10 записей с этим кодом - то при запросе типа Код: plaintext Эта неприятность не случилась бы, если бы cDelNomer в tab2 был уникален (т.е. одно значение не повторялось в нескольких записях). Но конечно лучше запрос с IN (SELECT ... ) использовать. 2) "Задумался" он и упал в конце концов, потому что у тебя чересчур много дублей было в таблице. В самом "страшном" случае - если бы ВСЕ записи обеих таблиц содержали одно и то-же значение в полях связи, в результате твоего запроса должна была-бы образоваться выборка размером примерно в 26 Гигабайт (20000*82000*17 - где 17 это размер одной записи новой выборки - я предполагаю что nID имеет тип Integer - т.е. 4 байта+12 байт+1 на признак удаления). Фокс не может производить выборок размером более 2 Гб (ограничение на размер dbf действует и на "временные" курсоры). Для превышения этого лимита в принципе достаточно чтобы в первой и второй таблице было хотя-бы по 12000 записей с идентичным значением полей связи (например ПУСТЫМИ полями cRegNomer и cDelNomer) 3) Сравнение Tab1.cRegNomer # " " - не совсем корректно - если поле имеет размер C(12) то и выражение для сравнения должно быть размером 12 символов, ИЛИ должна действовать установка SET ANSI ON (тогда фокс сам дополнит более короткую строку до длинны второй строки), ИЛИ нужно использовать сравнение == что аналогично "местному" применению SET ANSI ON (т.е. тогда условие будет выглядеть как [src]!(Tab1.cRegNomer == " ")[src]). В целом ряде случаев может помочь и банальное !EMPTY() - главное не забывать, что "пустое" это и пробел и TAB и перевод строки... Если поле не "бинарное" то обычно это не критично. Указанное сравнение же даст .T. и в случае когда cRegNomer = " 123" и для cRegNomer = " ABC"... И вообще всех тех где только ПЕРВЫЙ символ поля есть пробел. 4) Чтобы получать пользу (и удовольствие) от SQL запросов необходимо подумать про оптимизатор - обеспечить его нужными индексами. В данном случае - нужны индексы по этим символьным полям. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2005, 01:41:26 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33286864&tid=1593419]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
199ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 518ms |

| 0 / 0 |
