sorry_i_noob
@sorry_i_noob

Не могу понять, что вывелось в результате SQL запроса (FULL JOIN). Почему так много записей и нигде нет NULL?

Здравствуйте.
Есть вот такая задача:
В предположении, что приход и расход денег на каждом пункте приема фиксируется не чаще одного раза в день [т.е. первичный ключ (пункт, дата)], написать запрос с выходными данными (пункт, дата, приход, расход). Использовать таблицы Income_o и Outcome_o.

Схема базы данных:
income.gif
Задачу я решить смог (это задача с sql-ex.ru), решение писать не нужно. Но во время решения я набросал вот такой код:
SELECT Income_o.point, Income_o.date, inc, out
FROM Income_o
FULL JOIN Outcome_o ON Income_o.point = Outcome_o.point AND Income_o.date = Income_o.date

В результате он вывел в два раза больше записей, чем нужно. И нигде не было NULL. Я не могу понять, почему так произошло? Помогите разобраться (мне это нужно, чтобы лучше понять, как работает JOIN).
Результат работы моего кода
1		2001-03-22 00:00:00.000		15000.0000	1221.0000
1		2001-03-22 00:00:00.000		15000.0000	15348.0000
1		2001-03-22 00:00:00.000		15000.0000	2004.0000
1		2001-03-22 00:00:00.000		15000.0000	2075.0000
1		2001-03-22 00:00:00.000		15000.0000	2530.0000
1		2001-03-22 00:00:00.000		15000.0000	3110.0000
1		2001-03-22 00:00:00.000		15000.0000	3195.0400
1		2001-03-22 00:00:00.000		15000.0000	3663.0000
1		2001-03-22 00:00:00.000		15000.0000	4490.0000
1		2001-03-23 00:00:00.000		15000.0000	1221.0000
1		2001-03-23 00:00:00.000		15000.0000	15348.0000
1		2001-03-23 00:00:00.000		15000.0000	2004.0000
1		2001-03-23 00:00:00.000		15000.0000	2075.0000
1		2001-03-23 00:00:00.000		15000.0000	2530.0000
1		2001-03-23 00:00:00.000		15000.0000	3110.0000
1		2001-03-23 00:00:00.000		15000.0000	3195.0400
1		2001-03-23 00:00:00.000		15000.0000	3663.0000
1		2001-03-23 00:00:00.000		15000.0000	4490.0000
1		2001-03-24 00:00:00.000		3400.0000	1221.0000
1		2001-03-24 00:00:00.000		3400.0000	15348.0000
1		2001-03-24 00:00:00.000		3400.0000	2004.0000
1		2001-03-24 00:00:00.000		3400.0000	2075.0000
1		2001-03-24 00:00:00.000		3400.0000	2530.0000
1		2001-03-24 00:00:00.000		3400.0000	3110.0000
1		2001-03-24 00:00:00.000		3400.0000	3195.0400
1		2001-03-24 00:00:00.000		3400.0000	3663.0000
1		2001-03-24 00:00:00.000		3400.0000	4490.0000
1		2001-04-13 00:00:00.000		5000.0000	1221.0000
1		2001-04-13 00:00:00.000		5000.0000	15348.0000
1		2001-04-13 00:00:00.000		5000.0000	2004.0000
1		2001-04-13 00:00:00.000		5000.0000	2075.0000
1		2001-04-13 00:00:00.000		5000.0000	2530.0000
1		2001-04-13 00:00:00.000		5000.0000	3110.0000
1		2001-04-13 00:00:00.000		5000.0000	3195.0400
1		2001-04-13 00:00:00.000		5000.0000	3663.0000
1		2001-04-13 00:00:00.000		5000.0000	4490.0000
1		2001-05-11 00:00:00.000		4500.0000	1221.0000
1		2001-05-11 00:00:00.000		4500.0000	15348.0000
1		2001-05-11 00:00:00.000		4500.0000	2004.0000
1		2001-05-11 00:00:00.000		4500.0000	2075.0000
1		2001-05-11 00:00:00.000		4500.0000	2530.0000
1		2001-05-11 00:00:00.000		4500.0000	3110.0000
1		2001-05-11 00:00:00.000		4500.0000	3195.0400
1		2001-05-11 00:00:00.000		4500.0000	3663.0000
1		2001-05-11 00:00:00.000		4500.0000	4490.0000
2		2001-03-22 00:00:00.000		10000.0000	1440.0000
2		2001-03-22 00:00:00.000		10000.0000	2040.0000
2		2001-03-22 00:00:00.000		10000.0000	7848.0000
2		2001-03-24 00:00:00.000		1500.0000	1440.0000
2		2001-03-24 00:00:00.000		1500.0000	2040.0000
2		2001-03-24 00:00:00.000		1500.0000	7848.0000
3		2001-09-13 00:00:00.000		11500.0000	1500.0000
3		2001-09-13 00:00:00.000		11500.0000	2150.0000
3		2001-09-13 00:00:00.000		11500.0000	2300.0000
3		2001-10-02 00:00:00.000		18000.0000	1500.0000
3		2001-10-02 00:00:00.000		18000.0000	2150.0000
3		2001-10-02 00:00:00.000		18000.0000	2300.0000


Если что, вот правильно решение:
Споилер
SELECT Outcome_o.point, Outcome_o.date, inc, out
FROM Outcome_o
LEFT JOIN Income_o ON Income_o.point = Outcome_o.point AND Income_o.date = Outcome_o.date
UNION
SELECT Income_o.point, Income_o.date, inc, out
FROM Income_o
LEFT JOIN Outcome_o ON Outcome_o.point = Income_o.point AND Outcome_o.date = Income_o.date
Результат работы правильного решения
1		2001-03-14 00:00:00.000		NULL	        15348.0000
1		2001-03-22 00:00:00.000		15000.0000	NULL
1		2001-03-23 00:00:00.000		15000.0000	NULL
1		2001-03-24 00:00:00.000		3400.0000	3663.0000
1		2001-03-26 00:00:00.000		NULL	        1221.0000
1		2001-03-28 00:00:00.000		NULL	        2075.0000
1		2001-03-29 00:00:00.000		NULL	        2004.0000
1		2001-04-11 00:00:00.000		NULL	        3195.0400
1		2001-04-13 00:00:00.000		5000.0000	4490.0000
1		2001-04-27 00:00:00.000		NULL	        3110.0000
1		2001-05-11 00:00:00.000		4500.0000	2530.0000
2		2001-03-22 00:00:00.000		10000.0000	1440.0000
2		2001-03-24 00:00:00.000		1500.0000	NULL
2		2001-03-29 00:00:00.000		NULL	        7848.0000
2		2001-04-02 00:00:00.000		NULL	        2040.0000
3		2001-09-13 00:00:00.000		11500.0000	1500.0000
3		2001-09-14 00:00:00.000		NULL	        2300.0000
3		2001-10-02 00:00:00.000		18000.0000	NULL
3		2002-09-16 00:00:00.000		NULL	        2150.0000
  • Вопрос задан
  • 4017 просмотров
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
Visual_SQL_JOINS_orig.jpg
Ваш случай нижний-левый.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы