这:
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
都有很多,并且 if非常大。TRUE
FALSE
table3
如果分布存在偏差,如果table3
在table1
or中的行数少得多table2
,或者如果您正在使用 ,则第一个更好MySQL
。
更新:
如果大多数字段为假,则以下查询可能是最好的:
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
它确实如此)。