此:
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
。
更新:
如果大部分领域都是假的,下面的查询可能会是最好的:
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:
我不能检查它的火鸟,但在大多数系统上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
它)。
大部分将具有场假,这样看来,第一个将适合我更好 – zz1433 2009-07-17 12:30:28
然后,您可以用`table2`加入(这名假值),并在子查询的使用`table1`一个后备。 – Quassnoi 2009-07-17 12:37:38