2012-09-22 15 views
5

¿Hay un equivalente de álgebra relacional de la expresión SQL NOT IN?equivalente de álgebra relacional de SQL "NO EN"

Por ejemplo si tienen la relación:

A1 | A2 
---------- 
x | y 
a | b 
y | x 

Quiero eliminar todas las tuplas de la relación para los que A1 es en A2. En SQL podría consulta:

SELECT 
    * 
FROM 
    R 
WHERE 
    R.A1 NOT IN 
     (
     SELECT 
      A2 
     FROM 
      R 
     ) 
/

Lo que realmente me stumping es cómo subconsulta dentro del operador de selección álgebra relacional, es posible esto ?:

σ algunos sub consulta aquí R

Respuesta

6

En álgebra relacional, puedes hacer esto usando un producto carthesiano. Algo así como:

R - ρ a1, a2 a11, a21 A11 = A22 a11, a21 (R) x ρ a12, a22 (R))))

  • cambie el nombre de las columnas de R, fe de A1 a A11 (mano izquierda) y A12 (mano derecha)
  • tomar el producto vectorial de la R con columnas renombrados
  • seleccione las filas donde A11 es igual a22
  • proyecto a cabo a12 y a22 y mantener a11 y a21
  • cambiar el nombre de a1 y a2

que proporciona la registros coincidentes. Reste esto de R para encontrar las filas que no coinciden.

+1

puede usted explicar cómo funciona ... y tal vez ampliar los puntos suspensivos. Tengo problemas para entender el resultado del producto cruzado, solo hay dos campos en R entonces, ¿cómo se puede poner el operador pi en él con más de dos argumentos? – jsj

+0

Si solo hay dos columnas, puede omitir los puntos suspensivos. La respuesta también usó PI donde debería haber usado RHO, no estoy seguro si eso estaba en la edición o en la respuesta original. – Andomar

+0

@Andomar: También estoy teniendo problemas en la pregunta de álgebra relacional. He publicado mi pregunta [aquí] (http://stackoverflow.com/questions/18997845/how-to-convert-sql-to-relational-algebra-in-case-of-sql-joins). ¿Puedes ayudarme aquí? Gracias. –

2

La pregunta de apertura nos está enviando por el pensamiento equivocado. Debería ser:

¿Hay un equivalente de álgebra relacional de la expresión SQL R WHERE ... [NOT] IN S?

(Es decir, la respuesta es una operación entre dos relaciones, no algún tipo de filtro.)

la respuesta es sí, es (Natural) JOIN también conocido como el operador de pajarita .

Para ver por qué, primero arreglemos la solución de SQL dada. Como se muestra, está buscando el atributo A1 NOT IN relacionado con el atributo único A2. Eso es realmente una falta de coincidencia en los nombres de los atributos. SQL también permite NOT dentro de la condición where. Este SQL hace que la estructura lógica clara:

SELECT * FROM R 
WHERE NOT (A1 IN (SELECT A2 AS A1 FROM R)) 

Ahora podemos ver una proyección y un cambio de nombre. (El NOT circundante podemos implementar como un conjunto MINUS, según la primera respuesta.) Así que la RA es equivalente:

R - (R ⋈ ρ A1/A2 A2(R)))

Por interés, el Tutorial D es:

R MINUS (R JOIN (R {A2} RENAME A2 AS A1)) 

En la forma en que se hizo la pregunta, hay una resaca del pensamiento SQL. El WHERE de SQL lo fuerza al "modo" a nivel de fila. Esta es la regla 7 de contra Codd que requiere operadores de set-at-a-time.

En general, de SQL WHERE y RA de σ con sus filtros de fila se pueden implementar de forma más sucinta como (Natural) JOIN con la lógica set-en-un-tiempo. (Por ejemplo, esto es lo que & Fecha Darwen hacer en su Un álgebra.)

Cuestiones relacionadas