2011-11-21 8 views
7

En SQL Server, he el siguiente diseño:

enter image description hereSQL: ¿La primera condición en la declaración OR en JOIN se ejecuta siempre primero?

¿Es 100% seguro de que la primera condición de la instrucción OR en una unión se ejecutará en primer lugar? ¿Para que la siguiente instrucción SQL dé como resultado el resultado verde?

SELECT P.Name, D.Percentage 
FROM Personnel P 
JOIN Department D ON 
    P.Dep_Code = D.Code AND 
    (P.SubDep_Code = D.SubCode OR D.SubCode = '*') 
+2

Eso dependerá en gran medida tu base de datos Las bases de datos potentes como Oracle, DB2, SQL Server optimizarán (considerando índices, histogramas, restricciones, etc.). ¿De qué base de datos se trata? –

+0

Es SQL Server (pregunta actualizada) –

+0

'ao ​​b' y' bo a' significa lo mismo en lógica booleana ternaria. ¿Por qué le gustaría la combinación para filtrar 'P-A | 100' ya que la condición de unión es verdadera para las filas subyacentes? – Benoit

Respuesta

8

¿Es 100% seguro de que la primera condición de la instrucción OR en una unión se ejecuta en primer lugar?

No. No hay un orden de evaluación garantizado e incluso si toda la expresión todavía se evaluaría con el mismo valor y no influiría en qué filas coinciden en la unión.

Su consulta dará este resultado:

Name  Percentage 
---------- ----------- 
P-A  100 
P-A  20 
P-A  80 
P-B  100 

supongo que busca algo como esto.

select P.Name, 
     coalesce(D1.Percentage, D2.Percentage) as Percentage 
from Personnel as P 
    left outer join Department as D1 
    on P.Dep_Code = D1.Code and 
     P.SubDep_Code = D1.SubCode 
    left outer join Department as D2 
    on P.Dep_Code = D2.Code and 
     D2.SubCode = '*' 
where coalesce(D1.Percentage, D2.Percentage) is not null 

Puede probar las consultas de aquí el uso de SQL Server 2008. http://data.stackexchange.com/stackoverflow/qt/118492/

1

respuesta de Mikael es correcta, pero esta versión modificada de la consulta es más concisa:

SELECT P.Name, D.Percentage 
FROM Personnel P 
JOIN Department D 
ON P.Dep_Code = D.Code AND COALESCE(P.SubDep_Code,'*') = D.SubCode 
Cuestiones relacionadas