64 votes

Sélectionner dans une table les critères correspondants dans une autre ?

J'aimerais vraiment avoir de l'aide pour une requête SQL sur plusieurs tables. Je sais que ce genre de question est posé en permanence, mais je n'arrive pas à trouver une question suffisamment similaire pour comprendre les réponses.

Je veux sélectionner des lignes dans table_A qui ont une balise correspondante dans table_B .
Ainsi, par exemple, " select rows from table_a qui sont étiquetés 'chaise' " retournerait table_C .

Aussi, id est un unique dans table_a et non dans 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

Sinon, y a-t-il une meilleure façon d'organiser les données ?

132voto

Chris Nava Points 4048

La solution la plus simple serait un sélection secondaire corrélée :

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

Vous pouvez également rejoindre les tableaux et filtrer les lignes que vous voulez :

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

Vous devriez profiler les deux et voir lequel est le plus rapide sur votre ensemble de données.

8voto

rjschnorenberg Points 250

Vous devriez faire en sorte que les balises aient leur propre table avec une table de liaison.

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

3voto

RichardTheKiwi Points 58121
select a.id, a.object
from table_A a
inner join table_B b on a.id=b.id
where b.tag = 'chair';

2voto

KohanJ Points 21

J'ai un problème similaire (du moins je pense qu'il est similaire). Dans une des réponses ici, la solution est la suivante :

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

Cette clause du WHERE que je voudrais être :

WHERE B.tag = A.<col_name>

ou, dans mon cas précis :

WHERE B.val BETWEEN A.val1 AND A.val2

Plus de détails :

Le tableau A contient des informations sur l'état d'une flotte d'équipements. Chaque enregistrement d'état est accompagné d'une heure de début et de fin de cet état. La table B contient des données régulièrement enregistrées et horodatées sur l'équipement, que je veux extraire pour la durée de la période indiquée dans la table A.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X