Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Здравствуйте всем! DB2 8.2 Есть таблицы TAB1 и TAB2, которые связаны отношением "один TAB1-ко-многим TAB2" по полю TAB1_ID. Нужно вытащить все записи TAB1, склеенные по связи только с одной(любой) записью TAB2, и, если по связи записей TAB2 нет, то заполнить её ячейки значением null. Заранее благодарен. С уважением, Семен Попов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 15:46 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Semen Popov, Так это же стандартный SQL... читайте про joins. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 16:02 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Да, я знаю. Но вот засомневался. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 16:12 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Например, Код: plaintext 1. 2. 3. 4. 5. 6. 7. Нужно получить табличку: Код: plaintext 1. 2. 3. 4. left join вернёт Свету два раза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 17:02 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Что-то не вразумлю. Чувствую, что решение простое есть, но не могу его найти. Пока приходит только идея с использованием distinct: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 17:46 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Semen Popov, Distinct, скорее всего не получится в именно таком запросе. Первое, что в голову пришло - это функции или селекты в селекте использовать (синтаксис оракловый): Например, select t1.*, (select t2.TAB2_ID from TAB2 t2 where t1.TAB1_ID = t2.TAB1_ID) as TAB2_ID, (select t2.TAB1_ID from TAB2 t2 where t1.TAB1_ID = t2.TAB1_ID) as TAB1_ID, (select t2.NAME2 from TAB2 t2 where t1.TAB1_ID = t2.TAB1_ID) as NAME2 from TAB1 t1 может и проще можно, но уже вечер и домой охота.. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 18:45 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Yokohama select t1.*, (select t2.TAB2_ID from TAB2 t2 where t1.TAB1_ID = t2.TAB1_ID) as TAB2_ID, (select t2.TAB1_ID from TAB2 t2 where t1.TAB1_ID = t2.TAB1_ID) as TAB1_ID, (select t2.NAME2 from TAB2 t2 where t1.TAB1_ID = t2.TAB1_ID) as NAME2 from TAB1 t1 Вообще-то оно должно сломаться на записях 1:N. К тому же, что вложенные селекты, что функции (внутри которых селекты) - это чудовищные тормоза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 19:45 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Semen PopovЧто-то не вразумлю. Чувствую, что решение простое есть, но не могу его найти. Пока приходит только идея с использованием distinct: Код: plaintext Оно будет выглядеть менее ужасно (хотя не более правильно), если пользоваться синтаксисом с WITH. Кстати, в Oracle (с 9-й версии) оно тоже есть. Ваша задача решалась бы левым джойном TAB1 и TAB2, если бы в TAB2 не было "лишних" записей. Обозначим такую "отжатую" таблицу как TAB2X. В ней TAB1_ID будут уникальны, а TAB2_ID "какие-то". Например, минимумы. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Также в таблице TAB2 можно было бы завести колонку-маркер. Например, если она была бы списком пунктов в заказе, их можно было бы нумеровать последовательно 1..N для каждого TAB1_ID (назовём колонку ROW_NUM), и тогда запрос упрощается до Код: plaintext 1. 2. Основываясь на этом запросе, можно вспомнить, что у нас есть ещё и OLAP-функции, одна из которых может сыграть роль упомянутой колонки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 20:06 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Victor Metelitsa, на счет тормозов при использовании селектов согласен.На небольших объемах данных все ровно будет нормально. А на счет сломается .. здесь сама постановка вопроса уже имеет "колизию" на одну свету приходится и Петр и Денис. В примере указан петр, но тут нужно конкретнее - первый ли попавшийся или максимальный или минимальный... короче, нужна групповая функция в самой постановке, ИМХО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 20:15 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Исправления опечаток. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 21:47 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
YokohamaVictor Metelitsa, на счет тормозов при использовании селектов согласен.На небольших объемах данных все ровно будет нормально. Лучше не привыкать прибегать к кривым решениям, когда можно легко обойтись без них. А на счет сломается .. здесь сама постановка вопроса уже имеет "колизию" на одну свету приходится и Петр и Денис. В примере указан петр, но тут нужно конкретнее - первый ли попавшийся или максимальный или минимальный... короче, нужна групповая функция в самой постановке, ИМХО. Агрегатные функции не дадут вам гарантии, что эти значения будут взяты из одной и той же строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 21:50 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Victor Metelitsa Агрегатные функции не дадут вам гарантии, что эти значения будут взяты из одной и той же строки. Кто говорил, что они должны браться из какой-то конкретной строчки? Они (функции), как минимум, как-нибудь регламентируют этот процесс :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 23:02 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
YokohamaКто говорил, что они должны браться из какой-то конкретной строчки? Semen Popovсклеенные по связи только с одной(любой) записью TAB2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2009, 23:53 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Victor Metelitsa, Ну если "конкретная" - это "любая", то тогда, конечно же вы правы... ;)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2009, 08:48 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Yokohama, Victor Metelitsa спасибо за участие в обсуждении. YokohamaVictor Metelitsa, Ну если "конкретная" - это "любая", то тогда, конечно же вы правы... ;))"Конкретная" входит в множество "любая":-) Для моей задачи это не имеет значения. Неважно, какую "конкретную" выбрать. Я специально не стал указывать в постановке вопроса с какой записью склеивать, чтобы увидеть многие варианты, а затем выбрать самый быстрый. Хотя мог бы поставить условие - например, склеивать с той записью TAB2, у которой TAB2_ID будет наименьшим. Ваши варианты рассмотрю, попробую. Спасибо. Ещё порылся в форуме и увидел скрипт, который делает подобное. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2009, 09:21 |
|
||
|
Помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Теоретически OLAP функция (rownumber()over() - я бы ещё order by использовал внутри) должна быть выгоднее, а про индексы бы у index advisor'а спросил. Но, как говорил какой-то Великий Классик Марксизма-Ленинизма, практика - критерий истины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2009, 10:15 |
|
||
|
|

start [/forum/topic.php?fid=43&fpage=77&tid=1603155]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 11ms |
| total: | 149ms |

| 0 / 0 |
