|
|
|
Запрос с самообъединением и условием по датам
|
|||
|---|---|---|---|
|
#18+
Подскажите как возможно написать запрос без создания темповых таблиц. Проблема в следующем. Немного истории, раньше база работала так. Раньше: Каждый день закачивалась в базу новая таблица и мы имели след. исходные данные (в упрощенном виде): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Задача - Отобрать все новые записи из Tab2, а также совпавшие Tab1.kod=Tab2.kod, у которые несовпадают saldo (Tab1.saldo<>Tab2.saldo) Т.е.: Код: plaintext 1. 2. 3. 4. 5. 6. В случае двух разных таблиц это достигается простым LEFT JOIN с доп. условием WHERE: Код: plaintext 1. 2. 3. Теперь: Закачка идет в одну таблицу и вместо двух таблиц мы имеем одну общую, в которой храняться данные по всем прошедшим дням: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Задача остается той же. Получить надо такую же Tab3, задавая любые две даты. Как я не мучился, у меня что-то никак не получилось составить SQL запрос чтобы и по датам отобрать и еще внешнее левое объединение сделать. Я пытался писать что-то типа такого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Я так понимаю, что через самообъединение не получится.. копать в другую сторону, может через FROM (SELECT), какие у кого мысли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 11:35:57 |
|
||
|
Запрос с самообъединением и условием по датам
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. может, что-нибудь типа такого прокатит? не очень врубился в задачу... признаюсь честно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 12:28:42 |
|
||
|
Запрос с самообъединением и условием по датам
|
|||
|---|---|---|---|
|
#18+
А 3 запросами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 12:36:58 |
|
||
|
Запрос с самообъединением и условием по датам
|
|||
|---|---|---|---|
|
#18+
Раньше было совсем плохо... По текущей ситуации, перефразирую для себя: Есть таблица Tab4 ddate kod saldo01.01.04 1 5.00 01.01.04 2 3.05 01.01.04 3 2.40 02.01.04 1 5.9902.01.04 3 2.40 02.01.04 4 7.01 02.01.04 5 8.01 Надо выбрать записи за период, по одной для каждого кода, с минимальной датой, если код встречается несколько раз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 12:45:10 |
|
||
|
Запрос с самообъединением и условием по датам
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 12:49:23 |
|
||
|
Запрос с самообъединением и условием по датам
|
|||
|---|---|---|---|
|
#18+
Ирча: Так пока и работает:1,2 запроса - выборка по дате (скидывает в темп табл), 3 запрос производит сравнение Shurgenz: в принципе хотелось бы получить запрос с возможностью задавания двух не обязательно рядом лежащих дат... но и с идее перейти на INNER и поиграть с условием ON попробую поработать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 12:51:38 |
|
||
|
Запрос с самообъединением и условием по датам
|
|||
|---|---|---|---|
|
#18+
Geo Надо выбрать записи за период, по одной для каждого кода, с минимальной датой, если код встречается несколько раз? Нет, Geo ты меня неправильно понял. Необходимо сравнить между собой только 2 дня (желательно естественно любые) - и показать: - новые записи (тобишь новые kod, которых не было в другом дне) - а также все старые, у которых сальдо изменилось. Т.е. получить надо все ту же Tab3, токо если раньше у меня были две таблицы за два разных дня и пролемы их сравнения решалась простым LEFT JOIN с доп. условием, ТО теперь у меня одна таблица Tab4 и я не могу написать запрос... пока все это работает так, что из Tab4 я делаю просто выборку по дате с созданием temp. таблиц и их потом по старинке сравниваю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 13:02:59 |
|
||
|
Запрос с самообъединением и условием по датам
|
|||
|---|---|---|---|
|
#18+
Вообщем я тут еще поковырялся и понял что видимо придется делать через UNION. Первый запрос по наводкам Geo и Shurgenz я сляпал. Проблемы со второй частью. Поэтому сужаю свой вопрос и спрашиваю следующее: Есть таблица Tab4 ddate kod saldo01.01.04 1 5.00 01.01.04 2 3.05 01.01.04 3 2.40 02.01.04 1 5.9902.01.04 3 2.40 02.01.04 4 7.01 02.01.04 5 8.01 ... .... и т.д. Как отобрать новые записи за 02.01 которых нет за 01.01 (ключевое поле - kod)? Я пробую через подч. запрос с NOT EXISTS и доп. условиями по датам в WHERE, но он что-то очень долго работает (дуже целый час пашет). Как лучше это осуществить, какие идеи? Просто хотелось бы уйти от схемы с 3 запросами (2 запроса - создание темп. таблиц с записями за 01.01 и 02.01, а 3 запрос - делает Внешнее LEFT JOIN). Этоти запросы работют быстро, но... темп. таблицы...вообщем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 18:50:28 |
|
||
|
Запрос с самообъединением и условием по датам
|
|||
|---|---|---|---|
|
#18+
А зачем все-таки создавать временные таблицы? Почему нельзя заджойнить запросы на выборку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 19:34:32 |
|
||
|
Запрос с самообъединением и условием по датам
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 19:47:30 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32791023&tid=1670232]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
5ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 310ms |

| 0 / 0 |
