Para empezar, no entiendo por qué usas valores de una tabla que no se pide en el enunciado, no entiendo por qué igualas valores, no entiendo por qué usas productos cartesianos en vez de natural join
Qué valores uso de tablas que no se piden en el enunciado? Hay 3 tablas Proveedores, Artículos y Pedidos que son las que estoy usando todo el tiempo, los campos que uso son los que están definidos en el enunciado (quitando los que no son importantes obviamente por escribir menos) y las tablas que te estoy mostrando son ejemplos de filas que tengas guardadas en tus tablas (excepto tabla1 y tabla2 que las he puesto para mostrarte lo que era un producto cartesiano).
Una natural join en líneas generales no es otra cosa que un producto cartesiano con dos campos igualados. Las dos consultas siguientes son idénticas. (En algunos casos puedes encontrar especificado en la JOIN cuáles son los campos que se igualan pero si son obvios, se pueden no poner).
Sigma(Pedidos.Cod_art = Articulos.Cod_art)(Pedidos x Articulos)
(Pedidos JOIN Articulos)
Volvemos a hacer lo mismo pero usando JOINS:
Para empezar, mirando tu solución:
πNombre(Proveedores *(σCOLOR=’ROJO’(Artículos)) ∩ πNombre(Proveedores *(σCOLOR=’VERDE’(Artículos))
No puedes hacer una JOIN entre Proveedores y Artículos porque no tienes un campo/columna que igualar. La tabla que relaciona a los proveedores con los artículos es la tabla Pedidos. Cada pedido está formado por el código del proveedor, el código del artículo que suministra y la cantidad de éste.
Objetivo: Nombre de los proveedores que suministran artículos de color rojo y verde.
Preguntas que te tienes que hacer:
- De qué tabla saco los nombres de los proveedores? -> De la tabla Proveedores.
- Cómo sé qué artículos suministra un proveedor o qué proveedores suministran un artículo? -> Con la tabla Pedidos.
- Cómo sé de qué color es un artículo? -> Con la tabla Artículo.
Ahora el nombre de los proveedores que suministran artículos de color rojo y verde lo podemos obtener como la intersección de los nombres de los proveedores que suministran artículos rojos con los nombres de los que suministran artículos verdes. Vamos haciendo el ejercicio por partes:
RFinal (resultado final) = RRojo (resultado rojo) INTERSECCION RVerde (resultado verde)
Ahora vamos a calcular primero RRojo que son los nombres de los proveedores que suministran artículos rojos:
Empezamos cogiendo de la tabla Artículos los que son de color rojo:
R1 = Sigma(color = 'Rojo')(Artículo)
(Con esta no creo que tengas problemas porque es lo que has hecho tú) (Y R1 es por llamarlo de alguna manera. R1 es una tabla que contiene los artículos de color rojo. Se puede llamar como quieras, es como una variable en matemáticas de toda la vida)
Ahora queremos saber qué proveedores han suministrado esos artículos (los rojos). Para saberlo tenemos que utilizar la tabla Pedidos. Como ambas tablas (Pedidos y Artículos) tienen un campo en común (Cod_art) podemos hacer una natural join para obtener los códigos de los proveedores que han suministrado cada uno de los artículos que tenemos:
R2 = Pedidos JOIN R1
R2 es una tabla que se forma al juntar los artículos rojos (que teníamos en R1) con todos los Pedidos. Ahora tenemos filas con los códigos de los proveedores que han suministrado esos artículos. Como queremos los nombres y esos están en Proveedores, tenemos que hacer otra JOIN. En este caso R2 tiene un campo que es Cod_Prov (que viene de Pedidos) y Proveedores también lo tiene, por lo que se puede hacer la JOIN sin problemas.
R3 = Proveedores JOIN R2
Ahora R3 es una tabla cuyas filas tienen toda la información de los artículos rojos. Los pedidos a los que pertenecen (cosa que ya no nos vale para nada porque era una operación intermedia) y los proveedores que han realizado dicho pedidos (que es lo que nos interesa). Ahora nos quedamos con el nombre:
RRojo = PI(Nombre)(R3)
RRojo es la tabla que contiene el nombre de todos los proveedores que han suministrado artículos rojos.
Ahora tienes que hacer lo mismo con los artículos verdes para obtener RVerde con los nombres de los proveedores que han suministrado artículos verdes.
Y cuando lo tengas vas deshaciendo las "variables" (R1, R2,...) para que te quede la consulta completa. Te lo voy a deshacer para RRojo:
RRojo = PI(Nombre)(R3)
RRojo = PI(Nombre)(Proveedores JOIN R2)
RRojo = PI(Nombre)(Proveedores JOIN Pedidos JOIN Sigma(color = 'Rojo')(Artículo))
Y ya estaría la mitad hecha. Esa consulta te da los nombres de los proveedores que suministran artículos rojos.
PD: En este caso no te he puesto ejemplos por si era eso lo que te liaba. Pero desde mi punto de vista con los ejemplos es con lo que mejor se ve lo que estás haciendo con cada operación.