2011-03-27 21 views
28

Realmente agradecería algo de ayuda con una consulta SQL en tablas. Me doy cuenta de que este tipo de cosas se preguntan constantemente, pero no puedo encontrar una pregunta lo suficientemente similar para dar sentido a las respuestas.SQL: Seleccione de un criterio de coincidencia de tablas en otro?

Quiero seleccionar las filas de table_A que tienen una etiqueta correspondiente en table_B.
Por lo tanto, por ejemplo, "seleccionar filas de table_a que están etiquetadas como 'silla'" devolvería table_C.

Además, id es un único en table_a, y no en table_b.

table_A:    table_B:     table_C: 

id object   id tag     id object 
1  lamp   1  furniture   3  stool 
2  table   2  furniture   4  bench 
3  stool   3  furniture 
4  bench   4  furniture 
        4  chair 
        3  chair 

Alternativamente, ¿hay una mejor manera de organizar los datos?

Respuesta

63

La solución más simple sería un correlacionada sub seleccione:

select 
    A.* 
from 
    table_A A 
where 
    A.id in (
     select B.id from table_B B where B.tag = 'chair' 
) 

Como alternativa puede unirse a las tablas y filtrar las filas que desea:

select 
    A.* 
from 
    table_A A 
inner join table_B B 
    on A.id = B.id 
where 
    B.tag = 'chair' 

Usted debe perfilar ambos y ver cuál es más rápido en su conjunto de datos.

+0

@ sugerencia de rjschnorenberg es mejor si usted tiene el lujo de cambiar el esquema. En ese caso, se uniría a las tres tablas Items <> Item_Tags <> Tags usando dos cláusulas INNER JOIN. –

+0

Genial, eso es muy útil. No sabía que podría filtrar columnas de la tabla unida así. –

+0

En realidad, también puede escribir la línea de unión como "unión interna table_B B en A.ID = B.ID AND B.tag = 'chair'", pero prefiero poner filtros en WHERE. –

2
select a.id, a.object 
from table_A a 
inner join table_B b on a.id=b.id 
where b.tag = 'chair'; 
7

Debe hacer que las etiquetas tengan su propia tabla con una tabla de vinculación.

items: 
id object 
1  lamp 
2  table 
3  stool 
4  bench 

tags: 
id  tag 
1  furniture 
2  chair 

items_tags: 
item_id tag_id 
1  1 
2  1 
3  1 
4  1 
3  2 
4  2 
+0

Esta es la mejor respuesta suponiendo que tiene control sobre el esquema. Si no lo hace, considere la posibilidad de crear una vista que unifica las dos tablas de objetos para que pueda hacer lo que sugiere esta respuesta. –

Cuestiones relacionadas