powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Объединение записей из двух таблиц
16 сообщений из 16, страница 1 из 1
Объединение записей из двух таблиц
    #38183987
hmmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, всем привет!

Уже несколько дней мучаюсь вот с какой проблемой!

Есть у меня две таблицы (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.
CREATE  TABLE IF NOT EXISTS `data1` (
  `id_data1` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  `date` TEXT COLLATE 'NOCASE',
  `customer` TEXT COLLATE 'NOCASE',
  `fio` TEXT COLLATE 'NOCASE',
  `cost` TEXT COLLATE 'NOCASE');

CREATE  TABLE IF NOT EXISTS `data2` (
  `id_data2` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  `fio` TEXT COLLATE 'NOCASE',
  `date` TEXT COLLATE 'NOCASE',
  `status` TEXT COLLATE 'NOCASE',
  `result` REAL NOT NULL,
  `start_time` TEXT COLLATE 'NOCASE',
  `end_time` TEXT COLLATE 'NOCASE');



Если писать следующий запрос:
Код: sql
1.
2.
3.
4.
SELECT * 
FROM data1 
INNER JOIN data2 ON 
data1.date = data2.date AND data1.fio = data2.fio;


То, вроде бы, цель достигается, но только в идеальном случае, т.к. иногда бывает так, что в ФИО попадаются опечатки. Либо записи были созданы в одной системе и небыли синхронизированы с другой.
Если бы в SQLite работал FULL OUTER JOIN , то вопросов бы не возникало, но у нас максимум есть только LEFT OUTER JOIN .

Мне бы хотелось, чтобы запрос выводил как корректно сопоставленные записи из разных таблиц, так и записи, которые не удалось сопоставить.

Буду признателен за подсказки и идеи как это лучше всего сделать.
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38184046
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hmmm,

union all ?
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38184135
hmmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, через UNION ALL , тогда запрос у нас следующий выходит:
Код: sql
1.
2.
3.
4.
5.
SELECT date, fio
FROM data1 
UNION ALL 
SELECT date, fio 
FROM data2;



В результате мы действительно получим выборку в которой содержатся все составные ключи, которые у нас есть в обоих таблицах. В этом случае только по столбцам date и fio можно пустить запрос, поэтому мне не совсем понятно как получить таблицу примерно следующего содержания:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE  TABLE IF NOT EXISTS `data3` (
  `id_data3` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  `id_data1` INTEGER NOT NULL ,
  `date1` TEXT COLLATE 'NOCASE',
  `customer` TEXT COLLATE 'NOCASE',
  `fio1` TEXT COLLATE 'NOCASE',
  `cost` TEXT COLLATE 'NOCASE',
  `id_data2` INTEGER NOT NULL ,
  `fio2` TEXT COLLATE 'NOCASE',
  `date2` TEXT COLLATE 'NOCASE',
  `status` TEXT COLLATE 'NOCASE',
  `result` REAL NOT NULL,
  `start_time` TEXT COLLATE 'NOCASE',
  `end_time` TEXT COLLATE 'NOCASE');


Или предлагаете сделать UNION ALL для выборок LEFT OUTER JOIN ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT * 
FROM data1 
LEFT OUTER JOIN data2 
ON
	data1.date = data2.date 
AND
	data1.fio = data2.fio
UNION ALL
SELECT * 
FROM data2 
LEFT OUTER JOIN data1 
ON
	data1.date = data2.date 
AND
	data1.date = data2.fio


Тогда вообще абра-кодабра получается ...
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38184532
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38185472
hmmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
Ok!

Таблицы следующие:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE  TABLE IF NOT EXISTS data1 (
  id_data1 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  date TEXT COLLATE 'NOCASE',
  customer TEXT COLLATE 'NOCASE',
  fio TEXT COLLATE 'NOCASE',
  cost TEXT COLLATE 'NOCASE');

CREATE  TABLE IF NOT EXISTS data2 (
  id_data2 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  fio TEXT COLLATE 'NOCASE',
  date TEXT COLLATE 'NOCASE',
  status TEXT COLLATE 'NOCASE',
  result REAL NOT NULL,
  start_time TEXT COLLATE 'NOCASE',
  end_time TEXT COLLATE 'NOCASE');



Заполняем их значениями:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
INSERT INTO data1 (date, customer, fio, cost) VALUES ('2012-01-23', 'Вася&Ко', 'Пупкин Вася', '1000');
INSERT INTO data1 (date, customer, fio, cost) VALUES ('2012-01-23', 'Петя&Ко', 'Петров Петр', '2000');
INSERT INTO data1 (date, customer, fio, cost) VALUES ('2012-02-12', 'Ваня&Ко', 'Иванов Иван', '1000');
INSERT INTO data1 (date, customer, fio, cost) VALUES ('2012-02-12', 'Сережа&Ко', 'Сидоров Сергей', '1000');
INSERT INTO data1 (date, customer, fio, cost) VALUES ('2012-03-02', 'Макс&Ко', 'Максимов Максим', '1000');
INSERT INTO data1 (date, customer, fio, cost) VALUES ('2012-03-02', 'Джонни&Ко', 'Смит Джон', '1000');

INSERT INTO data2 (fio, date, status, result, start_time, end_time) VALUES ('Пупкин Вася', '2012-01-23', 'ok', 88.5, '10:11:32', '13:12:11');
INSERT INTO data2 (fio, date, status, result, start_time, end_time) VALUES ('Петров Петр', '2012-01-23', 'ok', 73.2, '10:09:21', '12:59:48');
INSERT INTO data2 (fio, date, status, result, start_time, end_time) VALUES ('Иванов Иван', '2012-02-12', 'ok', 96.4, '10:03:56', '14:03:32');
INSERT INTO data2 (fio, date, status, result, start_time, end_time) VALUES ('Сидоров Сергей', '2012-02-12', 'ok', 69.7, '10:05:16', '12:47:56');
INSERT INTO data2 (fio, date, status, result, start_time, end_time) VALUES ('Максимов Макисм', '2012-03-02', 'ok', 82.6, '10:07:37', '13:26:51');
INSERT INTO data2 (fio, date, status, result, start_time, end_time) VALUES ('Дое Майк', '2012-01-23', 'ok', 78.8, '10:32:51', '14:02:21');


В результате таблица 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.
SELECT * 
FROM data1 
INNER JOIN data2 ON 
data1.date = data2.date AND data1.fio = data2.fio;


В результате получаем:
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.
SELECT * 
FROM data1 
LEFT OUTER JOIN data2 
ON data1.date = data2.date 
AND data1.fio = data2.fio


В результате получаем:
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.
SELECT * 
FROM data2 
LEFT OUTER JOIN data1 
ON data1.date = data2.date 
AND data1.fio = data2.fio


То получим:
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.
SELECT date, fio
FROM data1 
UNION ALL 
SELECT date, fio 
FROM data2;


То получим:
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.
SELECT * 
FROM data2 
FULL OUTER JOIN data1 
ON data1.date = data2.date 
AND data1.fio = data2.fio


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
Подскажите, как получить такой результат?
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38185489
hmmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я внимательно посмотрел на запрос с UNION ALL и понял, что лучше его не использовать. Т.к. он не группирует совпадающие значения дат и ФИО. В данном случае лучше использовать просто UNION :
Код: sql
1.
2.
3.
4.
5.
SELECT date, fio
FROM data1 
UNION
SELECT date, fio 
FROM data2;


В результате получим:
datefio2012-01-23Дое Майк2012-01-23Петров Петр2012-01-23Пупкин Вася2012-02-12Иванов Иван2012-02-12Сидоров Сергей2012-03-02Максимов Макисм2012-03-02Максимов Максим2012-03-02Смит Джон
В результате такой запрос вернет все уникальные составные ключи.
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38185529
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hmmm,

а чем неподошел Union + два запроса с Left Join (со сменой местами таблиц)? должен выводить именно аналог Full Join
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38185569
hmmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pit_alex,

Этот запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT * 
FROM data1 
LEFT OUTER JOIN data2 
ON data1.date = data2.date 
AND data1.fio = data2.fio
UNION ALL
SELECT * 
FROM data2 
LEFT OUTER JOIN data1 
ON data1.date = data2.date 
AND data1.fio = data2.fio


Выводит такой результат:
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
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38185751
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hmmm,

Укажите в запросах одинаковый порядок полей и должен получиться нужный результат

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time
FROM data1 d1 
LEFT OUTER JOIN data2 d2 
ON d1.date = d2.date 
AND d1.fio = d2.fio
UNION
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time 
FROM data2 d2
LEFT OUTER JOIN data1 d1 
ON d1.date = d2.date 
AND d1.fio = d2.fio
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38186566
hmmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pit_alex,

Спасибо!
И действительно, ларчик просто открывался. Одно не понятно. Зачем разработчики SQLite заставляют идти на такие изощрения и не сделают FULL OUTER JOIN . Тогда бы одним составным запросом у многих стыло меньше :)
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38186588
hmmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для коллекции в этом топике осталось выяснить как найти значения таблиц не попавших в пересечение :)

Чтобы получить пересечения записей двух таблиц мы пишем такой запрос:
Код: sql
1.
2.
3.
4.
SELECT * 
FROM data1 
INNER JOIN data2 ON 
data1.date = data2.date AND data1.fio = data2.fio;


Чтобы получить все записи таблиц пишем такой запрос (спасибо pit_alex!!!):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time
FROM data1 d1 
LEFT OUTER JOIN data2 d2 
ON d1.date = d2.date 
AND d1.fio = d2.fio
UNION
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time 
FROM data2 d2
LEFT OUTER JOIN data1 d1 
ON d1.date = d2.date 
AND d1.fio = d2.fio


Для получения всех записей таблиц не попавших в пересечение, на сколько я понимаю, надо использовать вместо UNION -> EXCEPT , но почему-то запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time
FROM data1 d1 
LEFT OUTER JOIN data2 d2 
ON d1.date = d2.date 
AND d1.fio = d2.fio
EXCEPT
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time 
FROM data2 d2
LEFT OUTER JOIN data1 d1 
ON d1.date = d2.date 
AND d1.fio = d2.fio


Показывает только такой результат:
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.
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time 
FROM data2 d2
LEFT OUTER JOIN data1 d1 
ON d1.date = d2.date 
AND d1.fio = d2.fio
EXCEPT
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time
FROM data1 d1 
LEFT OUTER JOIN data2 d2 
ON d1.date = d2.date 
AND d1.fio = d2.fio


Вернет такой результат:
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.
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time
FROM data1 d1 
LEFT OUTER JOIN data2 d2 
ON d1.date = d2.date 
AND d1.fio = d2.fio
EXCEPT
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time 
FROM data2 d2
LEFT OUTER JOIN data1 d1 
ON d1.date = d2.date 
AND d1.fio = d2.fio
UNION
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time 
FROM data2 d2
LEFT OUTER JOIN data1 d1 
ON d1.date = d2.date 
AND d1.fio = d2.fio
EXCEPT
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time
FROM data1 d1 
LEFT OUTER JOIN data2 d2 
ON d1.date = d2.date 
AND d1.fio = d2.fio


То почему-то мы получим вот такой результат:
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
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38188082
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hmmm,

правильно расставить скобки для операторов Except и Union, сейчас они выполняются по порядку 1: EXCEPT 2:UNION 3: EXCEPT
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38188163
hmmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я пробовал. На скобки получаю такую ошибку:
Ошибка в запрос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.
(SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time
FROM data1 d1 
LEFT OUTER JOIN data2 d2 
ON d1.date = d2.date 
AND d1.fio = d2.fio
EXCEPT
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time 
FROM data2 d2
LEFT OUTER JOIN data1 d1 
ON d1.date = d2.date 
AND d1.fio = d2.fio)
UNION
(SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time 
FROM data2 d2
LEFT OUTER JOIN data1 d1 
ON d1.date = d2.date 
AND d1.fio = d2.fio
EXCEPT
SELECT d1.id_data1, d1.date, d1.customer, d1.fio, d1.cost, d2.id_data2, d2.fio, d2.date, d2.status, d2.result, d2.start_time, d2.end_time
FROM data1 d1 
LEFT OUTER JOIN data2 d2 
ON d1.date = d2.date 
AND d1.fio = d2.fio)
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38188195
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hmmm,

перед скобками добавить SELECT

Код: sql
1.
2.
3.
4.
5.
Select * from 
(...)
UNION
Select * from 
(...)
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38188453
hmmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! Мне бы такое в голову не пришло :)

Запрос получается каким-то монструозным, может можно его сделать более коротким?
...
Рейтинг: 0 / 0
Объединение записей из двух таблиц
    #38213172
economistalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получилось из ветки неплохое иллюстрирование пособие по объединениями :-))
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Объединение записей из двух таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]