2013-08-09 21 views
9

Sono molto nuovo di SQL e volevo un po 'di aiuto nella scrittura di questa query SQL.MySQL - come scrivere questa query

Ho una tabella film come questo:

Movie_id Actor_name Director_name 
1   a    AA 
1   b    AA 
2   b    BB 
2   d    BB 

Ora voglio stampare tutte le coppie di attori e registi che non hanno lavorato con l'altro - per esempio in questo caso si stamperà (a, BB) e (d, AA)

risposta

2

è possibile fare in questo modo:

SELECT a.Actor_name, d.Director_name 
FROM (
    (SELECT DISTINCT Actor_name from movie) a 
    CROSS JOIN 
    (SELECT DISTINCT Director_name from movie) d 
) WHERE NOT EXISTS (
    SELECT * FROM movie m 
    WHERE m.Actor_name=a.Actor_name 
    AND m.Director_name=d.Director_name 
) 

l'idea è quella di produrre tutte le possibili coppie di attori e registi (il prodotto cartesiano join nel mezzo della query), t gallina filtra i suoi risultati per escludere coppie collegate attraverso un film (la condizione NOT EXISTS).

Qui è un demo on sqlfiddle.

1

voglio fare questo primo sviluppando tutte le coppie di attori e registi con cross join (cioè Cartesian product), e poi filtrare questa lista giù utilizzando la tabella dei rapporti osservati.

SELECT * 
FROM (
    -- cross join 
    SELECT a.actor_name, d.director_name 
    FROM (SELECT DISTINCT actor_name FROM movies) a 
    ,(SELECT DISTINCT director_name FROM movies) d 
    ) pairs 
WHERE NOT EXISTS (
    SELECT 1 FROM movies m 
    WHERE pairs.actor_name = m.actor_name 
    AND pairs.director_name = m.director_name 
    ) 

SQLFiddle Demo (schema fondamentalmente scavenging dal violino di dasblinkenlight da quando mi ha battuto ad esso).

1

Un'alternativa:

select distinct t1.actor_name, t2.director_name from t t1, t t2 
where (t1.actor_name, t2.director_name) not in (
    select actor_name, director_name from t) 

Fiddle here.

Un'altra alternativa:

select distinct t1.actor_name, t2.director_name from t t1 
cross join t t2 left join t t3 
on t1.actor_name = t3.actor_name and t2.director_name = t3.director_name 
where t3.actor_name is null 

Fiddle here.

+1

tua prima è la più semplice. Mi piace :) – Franco

0

basano anche nel prodotto cartesiano (con alcune differenze con le risposte precedenti):

select distinct m.Actor_name, mo.Director_name 
from movie m 
cross join movie mo 
where (not exists (select mv.Actor_name, mv.Director_name 
        from movie mv 
        where (mv.Actor_name = m.Actor_name and mv.Director_name = mo.Director_name))) 

Fiddle