Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ SQL. Базы данных. _ When в FROM

Автор: Rosster 18.1.2011, 21:23

Можно ли в FROM записать какое-либо условие, например, если поле равно тому-то то выборка из такой таблицы,а если нет то из другой таблицы, что-то типа этого:
FROM
WHEN (id=1)
table1
ELSE
table2
при этом все колонки у обоих таблиц совпадают

Автор: arial 19.1.2011, 9:14

Цитата(Rosster @ 18.1.2011, 21:23) *
при этом все колонки у обоих таблиц совпадают

Если все колонки у обеих таблиц совпадают, то имеет смысл объединить их в одну таблицу и добавить колонку с идентификатором (id=1).

Автор: Iron Bug 19.1.2011, 23:32

ну, гипотетически можно попробовать сделать VIEW из двух таблиц. но не все базы это поддерживают.

можно также попробовать выборку с полным join'ом, что-нить типа

select (t1.field1*CheckId(t1.id)+t2.field1*CheckId(t1.id)) as field1 from table1 t1 full join table2 t2 on t1.id=t2.id where ...

(это пример, c численными значениями field1 и некоей абстракцией CheckId(), которая должна быть заменена на конструкцию проверки нужного условия и выдавать 0 или 1, в зависимости от false/true. точно это всё надо сочинять, согласно правилам SQL, я просто деталей уже не помню, слишком давно писала базы).
понятно, что для этого надо составлять очень хитрожопые условия суммирования полей (объединения, для строк) - так, чтобы одно из них занулялось по условию равенства единице этого самого id'а, а ещё как-то проверять на NULL (ибо при full join скорее всего будет множество пустых полей). да и работать будет весьма медленно.

да, кстати, через функции может сработать. юзерскую функцию можно написать, если база поддерживает такое.

а так, напрямую, средствами стандартного синтаксиса, нельзя.

Автор: MoPDoBoPoT 20.1.2011, 22:16

Цитата(Iron Bug @ 19.1.2011, 23:32) *
можно также попробовать выборку с полным join'ом, что-нить типа

Мне кажется имелась ввиду выборка не одного поля, а нескольких.
Цитата(Rosster @ 18.1.2011, 21:23) *
Можно ли в FROM записать какое-либо условие, например, если поле равно тому-то то выборка из такой таблицы,а если нет то из другой таблицы

Так как сущности односхемные, то можно это сделать двумя запросами, объединёнными операцией UNION:
SELECT FIELD_1, ..., FIELD_N
FROM TABLE_1
WHERE ...
UNION ALL
SELECT FIELD_1, ..., FIELD_N
FROM TABLE_2
WHERE ...

Я в примере написал UNION ALL, так как в твоём случае из таблиц выбираются взаимоисключающие записи (по условию), что избавляет СУБД от вложенной проверки на одинаковые записи.

Автор: Iron Bug 21.1.2011, 7:36

Цитата(MoPDoBoPoT @ 21.1.2011, 0:16) *
Мне кажется имелась ввиду выборка не одного поля, а нескольких.

ну дык, а в чём проблема написать такое выражение для скольки угодно полей?
это просто пример. реализация будет зависеть от типов данных в таблице и от того, пересекаются ли таблицы по значениям поля id.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)