LINUX.ORG.RU

Сделать JOIN поля из двух разных таблиц

 


0

1

Нужно сделать к выборке из таблицы A JOIN поля t из таблицы B по условию B.id=A.b
SELECT * FROM A LEFT OUTHER JOIN B.t ON B.id=A.b
НО для строк, для которых получится B.t=NULL, вместо этого нужны значения из такого же поля t другой таблицы C по аналогичному условию

★★

Последнее исправление: shatsky (всего исправлений: 1)

Не проще джойнить обе и в коде уже выбирать?

Kalashnikov ★★★
()

Проблема решается костылями. Но в целом, если ты делаешь join с возможность B.t=NULL, то корень проблемы в консерватории.

Anoxemian ★★★★★
()

select * from (select ...)

и да, пролема в консерватории

anonymous
()

Ещё костылик

select b.t
  from a
  join b on b.id = a.b
  where b.t is not null
union
select c.t
  from a
  join c on c.id = a.b
  join b on b.id = a.b
  where b.t is null
schizoid ★★★
()
Ответ на: Ещё костылик от schizoid

Ещё костылик

Не помню, как со стандартностью у этой функции.

select coalesce(b.t, c.t)
  from a
  join b on b.id = a.b
  join c on c.id = a.b

schizoid ★★★
()
Ответ на: комментарий от shatsky

Через union сработает, но это опять-таки костыль. В чем проблема? В том что таблицы не должны быть неконсистентны по отношению друг к другу, т.е. ситуации с B.t=NULL должны былы бы быть исключены еще на стадии проектировки.

В твоем случае, если логику нельзя подправить, сделай отдельный view с заменой\подстановкой значений индексов, чтобы 100% попасть в соответствующие индексы в первой таблице.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

В чем проблема? В том что таблицы не должны быть неконсистентны по отношению друг к другу, т.е. ситуации с B.t=NULL должны былы бы быть исключены еще на стадии проектировки.

Вот откуда вы такие умные беретесь? Ты его проект видел? Код смотрел? Может он отчет какой прикручивает к уже готовому проекту и по-другому уже не сделать? Может ситуация, когда 'b.t is null' у него стандартная? Например, в этом поле у него хранится адрес или номер телефона, а если поле пустое, то другой адрес или телефон берется из другой таблицы. Да много таких случаев можно придумать.

К ТС. schizoid тебе правильно говорит. Через union проще всего. Вроде можно через вложенные select еще сделать, но это еще больший костыль будет.

delete83 ★★
()
Ответ на: комментарий от Anoxemian

Ты в реальной жизни так же с людьми разговариваешь или бережешь лицо?

delete83 ★★
()
Ответ на: Ещё костылик от schizoid

не совсем понял зачем все так городить? Ведь в MySql есть и CASE и IFNULL http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

mysql> select * from tb1
    -> ;
+----+---+--------+
| id | b | blabla |
+----+---+--------+
|  1 | 1 |      1 |
|  2 | 2 |      2 |
|  3 | 3 |      3 |
|  4 | 4 |      4 |
+----+---+--------+
4 rows in set (0.00 sec)

mysql> select * from tb2;
+----+---------+
| id | cfield  |
+----+---------+
|  1 | fieldb1 |
|  2 | fieldb2 |
+----+---------+
2 rows in set (0.00 sec)

mysql> select * from tb3;
+----+---------+
| id | cfield  |
+----+---------+
|  3 | fieldc1 |
|  4 | fieldc2 |
+----+---------+
2 rows in set (0.00 sec)
SELECT 
  tb1.id
, tb1.b
, tb1.blabla
, IFNULL( tb2.cfield, tb3.cfield )
 FROM  `tb1` 
 LEFT JOIN tb2 ON tb2.id = tb1.b
 LEFT JOIN tb3 ON tb3.id = tb1.b
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SELECT tb1.id, tb1.b, tb1.blabla, IFNULL( tb2.cfield, tb3.cfield ) 
    -> FROM  `tb1` 
    -> LEFT JOIN tb2 ON tb2.id = tb1.b
    -> LEFT JOIN tb3 ON tb3.id = tb1.b
    -> ;
+----+---+--------+----------------------------------+
| id | b | blabla | IFNULL( tb2.cfield, tb3.cfield ) |
+----+---+--------+----------------------------------+
|  1 | 1 |      1 | fieldb1                          |
|  2 | 2 |      2 | fieldb2                          |
|  3 | 3 |      3 | fieldc1                          |
|  4 | 4 |      4 | fieldc2                          |
+----+---+--------+----------------------------------+
4 rows in set (0.00 sec)
BaBL ★★★★★
()
Ответ на: комментарий от BaBL

Мой пост ниже об этом как раз. А про MySQL в ОПе ни слова. COALESCE - это ANSI SQL. Матчасть.

schizoid ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.