|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
Коллеги, всем привет! Уже несколько дней мучаюсь вот с какой проблемой! Есть у меня две таблицы (data1 и data2) в которых содержатся записи из разных систем. В data1 содержется данные по оплате оказанных услуг (data1.cost), а в data2 процент выполнения данной услуги (data1.result). Мне необходимо, чтобы в 3-й таблице было полное объединение таблиц data1 и data2. Объединение таблиц можно производить по составному ключу по полям date и fio . Вот пример таблиц: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Если писать следующий запрос: Код: sql 1. 2. 3. 4.
То, вроде бы, цель достигается, но только в идеальном случае, т.к. иногда бывает так, что в ФИО попадаются опечатки. Либо записи были созданы в одной системе и небыли синхронизированы с другой. Если бы в SQLite работал FULL OUTER JOIN , то вопросов бы не возникало, но у нас максимум есть только LEFT OUTER JOIN . Мне бы хотелось, чтобы запрос выводил как корректно сопоставленные записи из разных таблиц, так и записи, которые не удалось сопоставить. Буду признателен за подсказки и идеи как это лучше всего сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 15:06 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
hmmm, union all ? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 15:30 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
Допустим, через UNION ALL , тогда запрос у нас следующий выходит: Код: sql 1. 2. 3. 4. 5.
В результате мы действительно получим выборку в которой содержатся все составные ключи, которые у нас есть в обоих таблицах. В этом случае только по столбцам date и fio можно пустить запрос, поэтому мне не совсем понятно как получить таблицу примерно следующего содержания: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Или предлагаете сделать UNION ALL для выборок LEFT OUTER JOIN ? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Тогда вообще абра-кодабра получается ... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 16:02 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 18:47 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
White Owl, Ok! Таблицы следующие: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Заполняем их значениями: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
В результате таблица data1 примет следующий вид: id_data1datecustomerfiocost12012-01-23Вася&КоПупкин Вася100022012-01-23Петя&КоПетров Петр200032012-02-12Ваня&КоИванов Иван100042012-02-12Сережа&КоСидоров Сергей100052012-03-02Макс&КоМаксимов Максим100062012-03-02Джонни&КоСмит Джон1000 data2 такой : id_data2fiodatestatusresultstart_timeend_time1Пупкин Вася2012-01-23ok88.510:11:3213:12:112Петров Петр2012-01-23ok73.20000000000000284210:09:2112:59:483Иванов Иван2012-02-12ok96.40000000000000568410:03:5614:03:324Сидоров Сергей2012-02-12ok69.70000000000000284210:05:1612:47:565Максимов Макисм2012-03-02ok82.59999999999999431610:07:3713:26:516Дое Майк2012-01-23ok78.79999999999999715810:32:5114:02:21 Делаем запрос Код: sql 1. 2. 3. 4.
В результате получаем: id_data1datecustomerfiocostid_data2fiodatestatusresultstart_timeend_time12012-01-23Вася&КоПупкин Вася10001Пупкин Вася2012-01-23ok88.510:11:3213:12:1122012-01-23Петя&КоПетров Петр20002Петров Петр2012-01-23ok73.20000000000000284210:09:2112:59:4832012-02-12Ваня&КоИванов Иван10003Иванов Иван2012-02-12ok96.40000000000000568410:03:5614:03:3242012-02-12Сережа&КоСидоров Сергей10004Сидоров Сергей2012-02-12ok69.70000000000000284210:05:1612:47:56 Опа! Нет всех наших "мартовских кроликов"! Нет ни Максимова Максима , нет ни Смита Джона и даже нет Дое Майка ! Смотрим внимательно на данные и видим, что Смит Джон есть только в data1 , а Дое Майк только в data2 . При этом, у Максимова Максима оказывается закралась опечатка в имени и в data2 вместо Макси м написано Макис м! Хорошо, делаем такой запрос: Код: sql 1. 2. 3. 4. 5.
В результате получаем: id_data1datecustomerfiocostid_data2fiodatestatusresultstart_timeend_time12012-01-23Вася&КоПупкин Вася10001Пупкин Вася2012-01-23ok88.510:11:3213:12:1122012-01-23Петя&КоПетров Петр20002Петров Петр2012-01-23ok73.20000000000000284210:09:2112:59:4832012-02-12Ваня&КоИванов Иван10003Иванов Иван2012-02-12ok96.40000000000000568410:03:5614:03:3242012-02-12Сережа&КоСидоров Сергей10004Сидоров Сергей2012-02-12ok69.70000000000000284210:05:1612:47:5652012-03-02Макс&КоМаксимов Максим1000 NULL NULL NULL NULL NULL NULL NULL 62012-03-02Джонни&КоСмит Джон1000 NULL NULL NULL NULL NULL NULL NULL В этом случае у нас появляются записи о Максимове и Смите. Если сделаем запрос "наоборот": Код: sql 1. 2. 3. 4. 5.
То получим: id_data2fiodatestatusresultstart_timeend_timeid_data1datecustomerfiocost1Пупкин Вася2012-01-23ok88.510:11:3213:12:1112012-01-23Вася&КоПупкин Вася10002Петров Петр2012-01-23ok73.20000000000000284210:09:2112:59:4822012-01-23Петя&КоПетров Петр20003Иванов Иван2012-02-12ok96.40000000000000568410:03:5614:03:3232012-02-12Ваня&КоИванов Иван10004Сидоров Сергей2012-02-12ok69.70000000000000284210:05:1612:47:5642012-02-12Сережа&КоСидоров Сергей10005Максимов Макисм2012-03-02ok82.59999999999999431610:07:3713:26:51 NULL NULL NULL NULL NULL 6Дое Майк2012-01-23ok78.79999999999999715810:32:5114:02:21 NULL NULL NULL NULL NULL В этом случае у нас появляются записи о Максимове и Дое. Если сделать такой запрос: Код: sql 1. 2. 3. 4. 5.
То получим: datefio2012-01-23Пупкин Вася2012-01-23Петров Петр2012-02-12Иванов Иван2012-02-12Сидоров Сергей2012-03-02Максимов Максим2012-03-02Смит Джон2012-01-23Пупкин Вася2012-01-23Петров Петр2012-02-12Иванов Иван2012-02-12Сидоров Сергей2012-03-02Максимов Макисм2012-01-23Дое Майк Замечательный результат! Но кроме всех составных ключей по таблицам data1 и data2 мы не получим. Необходимо получить таблицу, которую обычно выдает следующий запрос (FULL OUTER JOIN в SQLite не работает ): Код: sql 1. 2. 3. 4. 5.
id_data1datecustomerfiocostid_data2fiodatestatusresultstart_timeend_time12012-01-23Вася&КоПупкин Вася10001Пупкин Вася2012-01-23ok88.510:11:3213:12:1122012-01-23Петя&КоПетров Петр20002Петров Петр2012-01-23ok73.20000000000000284210:09:2112:59:4832012-02-12Ваня&КоИванов Иван10003Иванов Иван2012-02-12ok96.40000000000000568410:03:5614:03:3242012-02-12Сережа&КоСидоров Сергей10004Сидоров Сергей2012-02-12ok69.70000000000000284210:05:1612:47:5652012-03-02Макс&КоМаксимов Максим1000 NULL NULL NULL NULL NULL NULL NULL 62012-03-02Джонни&КоСмит Джон1000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 5Максимов Макисм2012-03-02ok82.59999999999999431610:07:3713:26:51 NULL NULL NULL NULL NULL 6Дое Майк2012-01-23ok78.79999999999999715810:32:5114:02:21 Подскажите, как получить такой результат? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 12:56 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
Я внимательно посмотрел на запрос с UNION ALL и понял, что лучше его не использовать. Т.к. он не группирует совпадающие значения дат и ФИО. В данном случае лучше использовать просто UNION : Код: sql 1. 2. 3. 4. 5.
В результате получим: datefio2012-01-23Дое Майк2012-01-23Петров Петр2012-01-23Пупкин Вася2012-02-12Иванов Иван2012-02-12Сидоров Сергей2012-03-02Максимов Макисм2012-03-02Максимов Максим2012-03-02Смит Джон В результате такой запрос вернет все уникальные составные ключи. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 13:03 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
hmmm, а чем неподошел Union + два запроса с Left Join (со сменой местами таблиц)? должен выводить именно аналог Full Join ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 13:25 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
pit_alex, Этот запрос Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Выводит такой результат: id_data1datecustomerfiocostid_data2fiodatestatusresultstart_timeend_time12012-01-23Вася&КоПупкин Вася10001Пупкин Вася2012-01-23ok88.510:11:3213:12:1122012-01-23Петя&КоПетров Петр20002Петров Петр2012-01-23ok73.210:09:2112:59:4832012-02-12Ваня&КоИванов Иван10003Иванов Иван2012-02-12ok96.410:03:5614:03:3242012-02-12Сережа&КоСидоров Сергей10004Сидоров Сергей2012-02-12ok69.710:05:1612:47:5652012-03-02Макс&КоМаксимов Максим1000 NULL NULL NULL NULL NULL NULL NULL 62012-03-02Джонни&КоСмит Джон1000 NULL NULL NULL NULL NULL NULL NULL 1Пупкин Вася2012-01-23ok88.510:11:3213:12:1112012-01-23Вася&КоПупкин Вася10002Петров Петр2012-01-23ok73.210:09:2112:59:4822012-01-23Петя&КоПетров Петр20003Иванов Иван2012-02-12ok96.410:03:5614:03:3232012-02-12Ваня&КоИванов Иван10004Сидоров Сергей2012-02-12ok69.710:05:1612:47:5642012-02-12Сережа&КоСидоров Сергей10005Максимов Макисм2012-03-02ok82.610:07:3713:26:51 NULL NULL NULL NULL NULL 6Дое Майк2012-01-23ok78.810:32:5114:02:21 NULL NULL NULL NULL NULL В принципе, он делает то, что надо, но! Вася, Петя, Ваня и Сережа повторились 2 раза, а также небыли перевернуты значения в нижней половине таблицы. Поэтому, там где в колонке id_data1 идентификаторы начинают свой отсчет с начала начинается невалидная информация. Т.к. по идее оно должно было бы вывестись так: id_data1datecustomerfiocostid_data2fiodatestatusresultstart_timeend_time12012-01-23Вася&КоПупкин Вася10001Пупкин Вася2012-01-23ok88.510:11:3213:12:1122012-01-23Петя&КоПетров Петр20002Петров Петр2012-01-23ok73.210:09:2112:59:4832012-02-12Ваня&КоИванов Иван10003Иванов Иван2012-02-12ok96.410:03:5614:03:3242012-02-12Сережа&КоСидоров Сергей10004Сидоров Сергей2012-02-12ok69.710:05:1612:47:5652012-03-02Макс&КоМаксимов Максим1000NULLNULLNULLNULLNULLNULLNULL62012-03-02Джонни&КоСмит Джон1000NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL5Максимов Макисм2012-03-02ok82.610:07:3713:26:51NULLNULLNULLNULLNULL6Дое Майк2012-01-23ok78.810:32:5114:02:21 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 13:48 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
hmmm, Укажите в запросах одинаковый порядок полей и должен получиться нужный результат Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 15:21 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
pit_alex, Спасибо! И действительно, ларчик просто открывался. Одно не понятно. Зачем разработчики SQLite заставляют идти на такие изощрения и не сделают FULL OUTER JOIN . Тогда бы одним составным запросом у многих стыло меньше :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2013, 11:12 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
Для коллекции в этом топике осталось выяснить как найти значения таблиц не попавших в пересечение :) Чтобы получить пересечения записей двух таблиц мы пишем такой запрос: Код: sql 1. 2. 3. 4.
Чтобы получить все записи таблиц пишем такой запрос (спасибо pit_alex!!!): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Для получения всех записей таблиц не попавших в пересечение, на сколько я понимаю, надо использовать вместо UNION -> EXCEPT , но почему-то запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Показывает только такой результат: d1.id_data1d1.dated1.customerd1.fiod1.costd2.id_data2d2.fiod2.dated2.statusd2.resultd2.start_timed2.end_time52012-03-02Макс&КоМаксимов Максим1000 NULL NULL NULL NULL NULL NULL NULL 62012-03-02Джонни&КоСмит Джон1000 NULL NULL NULL NULL NULL NULL NULL Соответственно, запрос в котором SELECT'ы из предыдущего поменялись местами: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Вернет такой результат: d1.id_data1d1.dated1.customerd1.fiod1.costd2.id_data2d2.fiod2.dated2.statusd2.resultd2.start_timed2.end_time NULL NULL NULL NULL NULL 5Максимов Макисм2012-03-02ok82.59999999999999431610:07:3713:26:51 NULL NULL NULL NULL NULL 6Дое Майк2012-01-23ok78.79999999999999715810:32:5114:02:21 Если же объединить два предыдущих запроса в один: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
То почему-то мы получим вот такой результат: d1.id_data1d1.dated1.customerd1.fiod1.costd2.id_data2d2.fiod2.dated2.statusd2.resultd2.start_timed2.end_time NULL NULL NULL NULL NULL 5Максимов Макисм2012-03-02ok82.59999999999999431610:07:3713:26:51 NULL NULL NULL NULL NULL 6Дое Майк2012-01-23ok78.79999999999999715810:32:5114:02:21 Есть у кого идеи о том, как все же получить такую таблицу? d1.id_data1d1.dated1.customerd1.fiod1.costd2.id_data2d2.fiod2.dated2.statusd2.resultd2.start_timed2.end_time52012-03-02Макс&КоМаксимов Максим1000 NULL NULL NULL NULL NULL NULL NULL 62012-03-02Джонни&КоСмит Джон1000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 5Максимов Макисм2012-03-02ok82.59999999999999431610:07:3713:26:51 NULL NULL NULL NULL NULL 6Дое Майк2012-01-23ok78.79999999999999715810:32:5114:02:21 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2013, 12:07 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
hmmm, правильно расставить скобки для операторов Except и Union, сейчас они выполняются по порядку 1: EXCEPT 2:UNION 3: EXCEPT ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2013, 14:45 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
Это я пробовал. На скобки получаю такую ошибку: Ошибка в запросe (1): near "(": syntax error Может я не так скобки ставлю? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2013, 15:41 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
hmmm, перед скобками добавить SELECT Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2013, 15:55 |
|
Объединение записей из двух таблиц
|
|||
---|---|---|---|
#18+
Спасибо! Мне бы такое в голову не пришло :) Запрос получается каким-то монструозным, может можно его сделать более коротким? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2013, 17:40 |
|
|
start [/forum/topic.php?fid=54&msg=38185529&tid=2008917]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 146ms |
0 / 0 |