varias - where con 3 condiciones sql
SQL: ¿Seleccionar de una tabla los criterios de coincidencia en otro? (4)
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.
Quiero seleccionar filas de la table_A
que tengan una etiqueta correspondiente en la table_B
.
Entonces, por ejemplo, "select rows from table_a
que están etiquetados ''chair''" devolvería table_C
.
Además, id
es ú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?
Debe hacer que las etiquetas sean su propia tabla con una tabla de enlaces.
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
La solución más simple sería una sub selección correlacionada :
select
A.*
from
table_A A
where
A.id in (
select B.id from table_B B where B.tag = ''chair''
)
Alternativamente, puede unir las tablas y filtrar las filas que desee:
select
A.*
from
table_A A
inner join table_B B
on A.id = B.id
where
B.tag = ''chair''
Debe perfilar ambos y ver cuál es más rápido en su conjunto de datos.
Tengo un problema similar (al menos creo que es similar). En una de las respuestas aquí, la solución es la siguiente:
select
A.*
from
table_A A
inner join table_B B
on A.id = B.id
where
B.tag = ''chair''
Esa cláusula DONDE me gustaría ser:
WHERE B.tag = A.<col_name>
o, en mi caso específico:
WHERE B.val BETWEEN A.val1 AND A.val2
Más detallado:
La Tabla A contiene información de estado de una flota de equipos. Cada registro de estado lleva consigo un tiempo de inicio y finalización de ese estado. La Tabla B contiene datos de la marca de tiempo regularmente grabados y registrados sobre el equipo, que quiero extraer para la duración del período indicado en la tabla A.
select a.id, a.object
from table_A a
inner join table_B b on a.id=b.id
where b.tag = ''chair'';