Это:
SELECT CASE WHEN p
THEN
(
SELECT name
FROM table2 t2
WHERE t2.id = t3.id
)
ELSE
(
SELECT name
FROM table1 t1
WHERE t1.id = t3.id
)
END
FROM table3 t3
, или это:
SELECT CASE WHEN p THEN t2.name ELSE t1.name END
FROM table3 t3
JOIN table1 t1
ON t1.id = t3.id
JOIN table1 t2
ON t2.id = t3.id
В системах, способных делать HASH JOIN
(то есть Oracle
, SQL Server
, PostgreSQL
, но не MySQL
), второе лучше, если логические значения распределены равномерно, т.е. е. есть много как TRUE
, так и FALSE
, и если table3
достаточно велико.
Первый вариант лучше, если в распределении наблюдается перекос, если строк в table3
намного меньше, чем в table1
или table2
, или если вы используете MySQL
.
Обновление:
Если большинство полей имеют значение false, следующий запрос, вероятно, будет лучшим:
SELECT CASE WHEN p THEN
(
SELECT name
FROM table2 t2
WHERE t2.id = t3.id
)
ELSE t1.name
END AS cname
FROM table3 t3
JOIN table1 t1
ON t1.id = t3.id
ORDER BY
cname
Подзапрос здесь будет использоваться только как запасной вариант и будет выполняться только для редких TRUE
значений.
Обновление 2:
Я не могу проверить это в Firebird, но в большинстве систем синтаксис ORDER BY
, как в запросе выше, будет работать. Если это не так, оберните запрос во встроенное представление:
SELECT cname
FROM (
SELECT CASE WHEN p THEN
(
SELECT name
FROM table2 t2
WHERE t2.id = t3.id
)
ELSE t1.name
END AS cname
FROM table3 t3
JOIN table1 t1
ON t1.id = t3.id
) q
ORDER BY
cname
, хотя это может снизить производительность (по крайней мере, в MySQL
это так).