2015-03-14 2 views
-1

Я пытался решить этот вопрос (№ 29) на http://www.sql-ex.ru/Правильное заявление SQL-запрос требует JOIN и UNION

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

И пришел с этим решением

SELECT Income_o.point, Income_o.date, Income_o.inc, Outcome_o.out 
FROM Income_o 
INNER JOIN Outcome_o ON Income_o.point = Outcome_o.point 

В результате, очевидно, неправильно (и, следовательно, на мой вопрос здесь). Он предполагает, что у пункта никогда не будет более 1 дохода и расходов, так разве этот запрос не правильный? Я вижу на той же странице, что правильный запрос имеет несколько значений столбца NULL. Я был бы признателен за объяснение (если не правильный ответ). Мой SQL не является основным (и именно поэтому я пытаюсь пройти через них! До сих пор было сделано 29 из 125 и только получал помощь от SO на 3 из них)

Ожидаемый результат (с веб-сайта):

результат правильного запроса:

снимок ожидаемого результата здесь - http://snag.gy/yN43V.jpg

PS Я знаю, что подсказка говорит UNION и ПРИСОЕДИНЯЙТЕСЬ, и я пытаюсь обойти это. Если я смогу получить ответ сам, я отправлю его.

+1

Ссылка, необходимая для связи, пожалуйста, разместите данные запроса с образцами данных и ожидаемым выходом. –

+1

Если таблица LEFT Income_o.point не имеет соответствующей Outcome_o.point, строка будет отброшена. Это ваш намек. –

ответ

0

Я думаю, что вы ищете LEFT JOIN

SELECT Income_o.point, Income_o.dat, Income_o.inc, Outcome_o.outc 
FROM Income_o 
LEFT JOIN Outcome_o ON Income_o.point = Outcome_o.point 

попробовать это SQL Fiddle example

+0

Nope .... это, конечно, то, что я уже пробовал, но, похоже, не правильный. Я просто проверил его на sql-ex.ru – ha9u63ar

+0

Ну, возможно, требуется полное внешнее соединение, но из вашего вопроса не ясно (всегда ли запись в таблице Income_O, или должны быть записи из result_o, не соответствующие запросу income_o?) – Martina

+0

Это не дает желаемых результатов, FULL OUTER JOIN действительно является решением. –

1

Вы хотите полное внешнее соединение на point и date:

SELECT 
    COALESCE(i.point, o.point) AS point, 
    COALESCE(i.date, o.date) AS date, 
    i.inc, 
    o.out 
FROM 
    Income_o AS i 
    FULL JOIN Outcome_o AS o ON i.point = o.point AND i.date = o.date 
; 

Выражения Coalesce обеспечить NULL не возвращается для этих столбцов: если сторона Income_o имеет значение NULL (поскольку в таблице нет m atch для строки Outcome_o), тогда значение берется с другой стороны.

В качестве альтернативы вы можете пойти с объединением двух внешних соединений, слева и справа:

SELECT 
    i.point, 
    i.date, 
    i.inc, 
    o.out 
FROM 
    Income_o AS i 
    LEFT JOIN Outcome_o AS o ON i.point = o.point AND i.date = o.date 

UNION 

SELECT 
    o.point, 
    o.date, 
    i.inc, 
    o.out 
FROM 
    Income_o AS i 
    RIGHT JOIN Outcome_o AS o ON i.point = o.point AND i.date = o.date 
; 

Если таблицы имеют матчи на указанном состоянии, и присоединяется будет возвращать их, но UNION устранит дублирование записей. Этот второй метод по существу является альтернативной реализацией полного внешнего соединения, полезной для случаев, когда синтаксис FULL JOIN не поддерживается. (MySQL является один продукт, который не поддерживает ПОЛНЫЙ JOIN.)

1

Вы можете использовать Group By с агрегатной функцией для достижения желаемого результата, суб-запрос будет сочетать в себе набор результатов, но даст результаты, как на сегодняшний день, если в одну и ту же дату есть две (внутри и вне транзакции), они будут отображаться как две строки, чтобы сделать ее одной строкой, мы можем использовать Group By с агрегатной функцией.

select point, date, max(inc), max(out) 
from 
(
select point, date, inc, NULL as out 
from income_o 
union all 
select point, date, NULL, out 
from outcome_o 
) 
dt 
group by point, date