Здравствуйте.
Есть вот такая задача:
В предположении, что приход и расход денег на каждом пункте приема фиксируется не чаще одного раза в день [т.е. первичный ключ (пункт, дата)], написать запрос с выходными данными (пункт, дата, приход, расход). Использовать таблицы Income_o и Outcome_o.
Схема базы данных:
Задачу я решить смог (это задача с 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