2011-02-28 10 views
9

¿Es esta la forma correcta de escribir tres uniones naturales? :¿Cómo hacer 3-table Natural Join?

SELECT C.name, P.name 
FROM client C NATURAL JOIN order O NATURAL JOIN product P 
WHERE O.date > '15.02.2011' 
+0

¿Qué tipo de base de datos está utilizando? (Servidor SQL, MySQL, etc.) – dana

+1

antiguo servidor mysql –

+0

@dana, no hay 'combinación natural 'en SQL Server. – Pacerier

Respuesta

17

Este es de hecho la sintaxis típica para una imagen natural se une. Sin embargo, no todas las bases de datos admiten combinaciones naturales (por ejemplo, no creo que SQLServer lo admita) y no creo que exista un estándar ANSI para la unión natural.

Obsérvese que naturales se une a generalmente se consideran peligrosos y deben evitarse, ya que oscurecen la relación de combinación de la que depende una consulta y pueden dar lugar a consultas cuyo significado cambie si se modifica el modelo de datos.

+0

LAS UNIONES NATURALES son tristemente ANSI, pero estoy de acuerdo en que deben evitarse. –

+0

+1: De acuerdo, la lógica (imho) debe ser explícita y no implícita. Como tal, use INNER JOIN en su lugar. – MatBailie

+12

'NAUTRAL JOIN' es una sintaxis SQL-92 válida. En un DBMS verdaderamente relacional, 'NATURAL JOIN' es la única combinación que necesita. Cualquier herramienta es peligrosa en las manos equivocadas. – onedaywhen

0

utilizando esta sintaxis se considera peligroso, como ya se ha mencionado. Consideremos el siguiente ejemplo: T1 (id, nombre, edad) T2 (id, edad, ciudad)

SELECT T1.id, T1.name, T1.age, T2.age 
FROM T1 NATURAL JOIN T2 

Qué columna se debe utilizar para unirse a? identificación o edad? No está definido. Cada vendedor puede implementar su propia forma de resolver esos problemas.

En lugar de esta sintaxis, considerar el uso de sintaxis de la combinación tradicional:

SELECT T1..... 
FROM T1 INNER JOIN T2 on T1.id=T2.id 
+0

Tiene usted se dirigió a la pregunta? La implementación adecuada de 'NATURAL JOIN' por un proveedor debe promover un mejor diseño del esquema. El suyo es un argumento de hombre de paja. Su sintaxis 'INNER JOIN' es SQL-92 (como lo es' NATURAL JOIN'). Considero que la sintaxis de unión equivalente "tradicional" es 'FROM T1, T2 WHERE T1.id = T2.id'. – onedaywhen

+0

Aunque NATURAL JOIN es estándar en SQL-92, algunos proveedores de DBMS líderes no lo admiten. Usar tu sintaxis "tradicional" no es tan común como el mío. Debo escribir "común", en lugar de "tradicional" para describir lo que quise decir. –

1

Para comprobar la sintaxis SQL cuando su producto de elección no lo soporta, utilice el Mimer SQL-92 validator. Debería descubrir que order y date son palabras reservadas. Cámbialos a my_order y my_date respectivamente y descubrirá que el suyo es una sintaxis de Transición SQL-92 válida.