2012-06-04 13 views
8

Tengo tres tablas que están involucradas en mi problema, 2 tablas regulares y una tabla de unión para a tiene muchas y pertenece a muchas relaciones. Son similares a esto:Consulta SQL para tabla de unión y valores múltiples

table1 
--id 
--data 

table2 
--id 
--data 

table1_table2 
--table1_id 
--table2_id 

lo tanto, mi pregunta es cómo iba a consultar (usando una combinación) de algo que tendría uno o más valores en el table1_table2 para un artículo en la Tabla 1. Por ejemplo:

Table 1 
+----------+ 
|id | data | 
+----------+ 
|1 | none | 
+----------+ 
|4 | match| 
+----------+ 

Table 2 
+----------+ 
|id | data | 
+----------+ 
|1 | one | 
+----------+ 
|2 | two | 
+----------+ 

table1_table2 
+----------------------+ 
|table1_id | table2_id | 
+----------------------+ 
|1   | 1   | 
+----------------------+ 
|4   | 1   | 
+----------------------+ 
|4   | 2   | 
+----------------------+ 

necesito una consulta que se correspondería con la Tabla 1 fila 4 Identificación porque tiene un enlace a través de la unión de ambas filas 1 y 2 de la Tabla 2. Si esto es confuso por favor pregunte nada.

Tal vez estaba un poco confuso, estoy usando table1_table2 como una unión no como de. Necesito para asegurarse de que coincide con 1 y 2, tanto desde el cuadro 2.

Aquí es mi consulta hasta el momento ...

SELECT DISTINCT table1.id, 
table2.data 

FROM table1 

LEFT JOIN table1_table2 ON table1.id = table1_table2.table1_id 
LEFT JOIN table2 ON table2.id = table1_table2.table2_id 

Necesito un donde que hará que para una entrada en la tabla 1 se coincide tanto con 1 y 2 de la tabla 2.

La salida Busco sería:

+---------------------+ 
|table1.id|table2.data| 
+---------------------+ 
|4  |one  | 
+---------------------+ 
|4  |two  | 
+---------------------+ 
+0

¿Está aprendiendo SQL (es decir, es esta tarea?) Esta es una pregunta de seguimiento muy obvia a una de sus preguntas anteriores (http://stackoverflow.com/questions/10726322/sql-join-using-a-join -table-from-rails). No tengo ningún problema con que aprendas SO, pero tal vez quieras etiquetar tu pregunta [tarea] si es así. – Tony

+0

Esto no es para la escuela. – Red

+0

Aunque la pregunta se relaciona con una pregunta anterior, en realidad no utiliza las mismas tablas. Estoy cambiando el nombre de las tablas que estoy usando. – Red

Respuesta

4

El siguiente enfoque funciona si puede garantizar que no haya duplicados en la tabla Table1_Table2. Quizás puedas comenzar aquí y refinarlo un poco. Observe cómo funciona la condición JOIN: poner el IN en la condición de unión funciona de forma diferente que si pone la condición IN en la cláusula WHERE.

He utilizado las marcas hash para los valores que necesitaría para insertar su código en el SQL.

SELECT Table1.id, COUNT(Table1_Table2.Table2_id) 
FROM Table1 
JOIN Table1_Table2 ON (Table1_Table2.Table1_id = Table1.id 
        AND Table1_Table2.Table2_id IN (#somelist#)) 
GROUP BY Table1.id 
HAVING COUNT(Table1_Table2.Table2_id) = (#length of somelist#) 

Oops - ha cambiado su pregunta en la forma que sugerí y he ignorado su edición. Pero esto debería comenzar, ya que devuelve todas las identificaciones de Table1 que le interesan.

0

Creo que debería ser capaz de seleccionar la siguiente:

select table1_id, count(*) as count from table1_table2 group by table1_id having count > 2; 

grupo de, contar y tener son tus amigos!

+0

Tal vez estaba un poco confuso, estoy usando table1_table2 como un join no como de from. Necesito asegurarme de que coincida con 1 y 2 ambos. Cambiaré la pregunta para reflejar esto. – Red

2

Aquí está mi solución. No es muy generalizado Debería publicar un comentario si esta solución no funciona porque es demasiado específica para su situación.

SELECT DISTINCT Table1.id 
FROM Table1 
INNER JOIN table1_table2 a ON (table1.id = table1_table2.table1_id 
          AND table2.id = 1) 
INNER JOIN table1_table2 b ON (table1.id = table1_table2.table1_id 
          AND table2.id = 2) 
+1

Creo que esto funcionaría, el único problema es que a veces puedo tener más de dos valores, a veces podría tener hasta 50 valores. Que muchas uniones se harían bastante difíciles en la base de datos y dinámicamente hacerlas se pondrían difíciles. – Red

+0

¿Desea la lista de todas las ID de table1 que coinciden con TODAS las entradas de la tabla 2, independientemente de cuántas cosas hay en la tabla 2? –

+0

Bueno, no todo en la tabla 2, pero al menos lo que dije. En el ejemplo, solo quería la lista de entradas de la tabla 1 que coincidían con 1 y 2. Sin embargo, podría (si existieran) necesitar una consulta que obtenga todas las entradas de la tabla 1 que coincidan con 1, 2, 3 y 7 de la tabla 2 Necesito asegurarme de que coincida con todos. – Red

1

Si estuviera haciendo esto en SQL Server colocaría los valores que desea verificar en una tabla temporal (o variable de tabla) y luego usa una variación de lo que dice @ChrisCunningham.

CREATE TABLE #temp (Id INT) 
INSERT INTO #temp 
VALUES (1, 3, 7) 

SELECT a.id AS table1ID, table2.data 
FROM 
(
     SELECT Table1.id, Table1_Table2.table2_id 
    FROM Table1 JOIN Table1_Table2 
     ON (Table1_Table2.Table1_id = Table1.id      
    AND Table1_Table2.Table2_id IN (SELECT Id FROM #temp)) 
    GROUP BY Table1.id 
    HAVING COUNT(Table1_Table2.Table2_id) = (SELECT count (*) FROM #temp) 
    ) a 
JOIN Table2 ON Table2.id = a.Table2_id 

Por supuesto que no estoy seguro de qué mecanismos PostgreSQL tiene para las tablas temporales, sino que incluso lo haría un procedimiento almacenado en el que utiliza algún tipo de función de división para crear los valores de la tabla temporal en lugar de que el forma en que lo hice. Pero al menos esto podría darte una idea.

Cuestiones relacionadas