これ:
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
、ブール値が均等に分散されている場合、つまり と が両方とも多数存在し、 が非常に大きい場合は、2 番目の方法が適して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
そうです)。