Cómo seleccionar datos que no coinciden en otra columna

Entonces tengo esta tabla A:

color ID MODEL ----------------------------- networking | 10 | HONDA blue | 10 | TOYOTA networking | 15 | ISUZU networking | 30 | MITSUBISHI networking | 5 | HONDA blue | 5 | SUBARU orange | 10 | HYUNDAI black | 40 | CHRYSLER 

me gustaría get todo el rojo y azul que no tiene la misma identificación entre sí

Entonces mi resultado esperado es:

 color ID ------------ networking | 15 networking | 30 

o usando un anti join

 select t1.color, t1.id from tableA t1 left outer join tableA t2 on t2.id = t1.id and t2.color != t1.color where t1.color in ('networking', 'blue') and t2.color is null 

Algo como esto

 SELECT * FROM yourtable WHERE id IN (SELECT id FROM youtable GROUP BY id HAVING Count(case when color IN ( 'networking', 'blue' ) then 1 end) = 1) 

Use NOT EXISTS para search filas con id correspondiente pero con diferentes colors:

 select * from yourtable a where a.color IN ('networking', 'blue') and not exists ( select 1 from yourtable b where a.id = b.id and b.color NOT IN ('networking', 'blue') ) 

Notas:

  • para una búsqueda eficiente, considere agregar índices (valores más distintos significan una mayor eficiencia de cruce de treees)
  • Considere la posibilidad de normalizar sus datos con una tabla de color dictionary adicional

Creo que el resultado esperado debería ser el rojo 15. El rojo 30 no calificaría debido al amarillo 30, que comparte la misma identificación. Mira mi código:

 SELECT t.id, t.color FROM t INNER JOIN (SELECT id FROM t GROUP BY id HAVING COUNT(*) = 1) sub ON t.id = sub.id WHERE color = 'networking' OR color = 'blue' 

Se eliminó la respuesta anterior. Probado esto y está funcionando.

 WITH tbl AS (SELECT color, id FROM TABLE1 WHERE color IN ('networking', 'blue') ) SELECT t1.color, t1.id FROM tbl t1 LEFT JOIN tbl t2 ON t1.id = t2.id AND t1.color <> t2.color WHERE t1.id IS NULL OR t2.id IS NULL 

Esta consulta devuelve todos los ID donde el COLOR es rojo o azul pero no ambos.

 select id , color from your_table where color in ('networking', 'blue') and id in ( select id from your_table where color in ('networking', 'blue') group by id having count(*) = 1)