2010-04-08 21 views
9

Actualizado:SQL: ¿Cómo unir una vista con una tabla?

estoy usando la declaración de MySQL para crear una vista:

necesito mostrar Editores primer nombre, apellido y la ciudad si se envían más de 50 libros. Las tres tablas que tengo son:

create table editors (
ed_id char(11), 
ed_lname varchar(20), 
    ed_fname varchar(20), 
    ed_pos varchar(12), 
    phone varchar(10), 
    address varchar(30), 
    city varchar(20), 
    state char(2), 
    zip char(5), 
    ed_boss char(11)); 

create table titleditors (
ed_id char(11), 
title_id char(6), 
ed_ord integer); 

create table salesdetails (
sonum integer, 
qty_ordered integer, 
qty_shipped integer, 
title_id char(6), 
date_shipped date); 

¿Alguien me puede decir qué código crearía este resultado? No hice las tablas, solo tengo que trabajar con lo que me dieron.

+0

¿Qué motor RDBMS usas? – Quassnoi

Respuesta

18

sintaxis anticuado (nótese la entremezcla de unirse a las condiciones y las condiciones de filtro):

CREATE VIEW qtyorderedview AS 
    SELECT 
    salesdetails.title_id, salesdetails.qty_shipped, 
    editors.ed_id, editors.ed_lname, editors.ed_fname, editors.city 
    FROM 
    titleditors, salesdetails, editors 
    WHERE 
    titleditors.title_id = salesdetails.title_id 
    AND editors.ed_id = titleditors.ed_id 
    AND salesdetails.qty_ordered > 50 

sintaxis moderna (condiciones de unión y condiciones de filtro están separados):

CREATE VIEW qtyorderedview AS 
    SELECT 
    salesdetails.title_id, salesdetails.qty_shipped, 
    editors.ed_id, editors.ed_lname, editors.ed_fname, editors.city 
    FROM 
    titleditors 
    INNER JOIN salesdetails ON titleditors.title_id = salesdetails.title_id 
    INNER JOIN editors  ON editors.ed_id = titleditors.ed_id 
    WHERE 
    salesdetails.qty_ordered > 50 

se une contra vistas funcionan exactamente igual se une a las tablas. Simplemente use el nombre de vista en lugar de un nombre de tabla normal.

+0

Estoy usando una base de datos DB2. La sintaxis que proporciona parece que debería funcionar a la perfección, pero estoy recibiendo errores. Tal vez mi base de datos DB2 es wonky. –

+0

EDITAR * Gracias. se preguntaba cómo lo verificaste. +1 –

+0

@gamerzfuse: ¿Cuál es el error exacto que obtienes? – Tomalak

5
SELECT e.* 
FROM (
     SELECT DISTINCT te.ed_id 
     FROM (
       SELECT title_id 
       FROM sales_details 
       GROUP BY 
         title_id 
       HAVING SUM(qty_shipped) > 50 
       ) t 
     JOIN titleditors te 
     ON  te.title_id = t.title_id 
     ) te 
JOIN editors e 
ON  e.ed_id = te.ed_id 
+0

Creo que su enfoque de agrupamiento es mejor que mi unión plana, pero para mí la pregunta no es lo suficientemente clara como para saberlo con certeza. – Tomalak

+0

Creo que esta es la solución correcta. Sin embargo, no estoy seguro de cuál es el criterio exactamente. ¿Son más de 50 libros por título o más de 50 libros por editor? Sin embargo, ambos requieren la cláusula having. –

Cuestiones relacionadas