Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

SQL. Объединить вывод из 2х таблиц. Не зависимых друг от друга.

Marvin Знаток (320), на голосовании 5 лет назад
Объединить вывод из 2х таблиц. Не зависимых друг от друга.
Структура таблицы withdraw: id,text,iduser,time
Структура таблицы transfer: id,text,iduser;time

Необходимо вывести все записи из обоих таблиц где iduser = 1 и отсортировать их по time (unixtime).
Хелп плиз)
Голосование за лучший ответ
Miku Hatsune Мудрец (11188) 5 лет назад
Увы, объединять значения двух таблиц силами SQL невозможно. Лучше сделай два отдельных запроса
SELECT * FROM withdraw WHERE iduser = 1
SELECT * FROM transfer WHERE iduser = 1
объедини и обработай их уже на стороне клиента.
МаксимОракул (92273) 5 лет назад
лол
union all изучи)
Miku Hatsune Мудрец (11188) Хм! Да, пожалуй, я была не права
Дед Мазай Гений (58109) 5 лет назад
select *
from
(
select id, text, iduser, time from withdraw where iduser = 1
union all
select id, text, iduser, time from transfer where iduser = 1
)
order by time

Условие iduser = 1 можно вынести во внешний запрос, если это не ухудшит производительность. Хорошая СУБД оптимизирует запрос одинаково в обоих случаях.

Без подзапроса тоже работает (возможно не на всех СУБД)

select id, text, iduser, time from withdraw where iduser = 1
union all
select id, text, iduser, time from transfer where iduser = 1
order by time
MarvinЗнаток (320) 5 лет назад
Как раз таки с подзапросом и не сработало в Mysql. А вот без - работает.
Дед Мазай Гений (58109) Значит надо добавить псевдоним select * from ( select id, text, iduser, time from withdraw where iduser = 1 union all select id, text, iduser, time from transfer where iduser = 1 ) t order by time
Jurijus Zaksas Искусственный Интеллект (420188) 5 лет назад
create view wt_common as
select * from withdraw
union all
select * from transfer;

Дальше работаешь как с обычной таблицей.
Максим Оракул (92273) 5 лет назад
Ну, с двумя селектами уже написали)
Но можно сделать и с одним))
...
SELECT NVL(w.id, t.id) as id
, NVL(w.text, t.text) as text
, NVL(w.iduser, t.iduser) as iduser
, NVL(w.time, t.time) as time
FROM withdraw w
FULL JOIN transfer t ON 1<>1
WHERE w.id = 1
...
Это для Oracle, а для ms sql, вместо функции nvl(), можно использовать isnull()
Дед МазайГений (58109) 5 лет назад
Вместо nvl есть стандартная функция coalesce, в том числе в Оракле. coalesce мощнее, чем nvl.
Ну и зачем так делать? На мой взгляд, это говнокод. И ошибка в условии WHERE.
Максим Оракул (92273) точно, там ошибка надо так WHERE (w.id = 1 or w.id is null) and (t.id = 1 or t.id is null)
Игорь Шипов Ученик (234) 5 лет назад
ебать ты долбоёб братишка земля тебе асфальтом
Похожие вопросы