web-dev-qa-db-fra.com

Choisir dans une table des critères correspondant à une autre?

J'apprécierais vraiment de l'aide avec une requête SQL sur plusieurs tables. Je me rends compte que ce genre de chose est constamment posé, mais je ne trouve pas une question assez similaire pour donner un sens aux réponses.

Je veux sélectionner les lignes de table_A qui ont une balise correspondante dans table_B.
Ainsi, par exemple, "sélectionner des lignes dans table_a portant le libellé" chaise "" renverrait table_C.

De plus, id est 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, existe-t-il un meilleur moyen d'organiser les données?

37
user668660

La solution la plus simple serait un corrélé sous select :

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

Sinon, vous pouvez rejoindre les tables et filtrer les lignes souhaitées:

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 jeu de données.

85
Chris Nava

Vous devriez créer des balises 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
8
rjschnorenberg
select a.id, a.object
from table_A a
inner join table_B b on a.id=b.id
where b.tag = 'chair';
3
RichardTheKiwi

J'ai un problème similaire (du moins je pense que c'est pareil). Dans l'une des réponses, 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 WHERE j'aimerais être:

WHERE B.tag = A.<col_name>

ou, dans mon cas particulier:

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

Plus détaillé:

Le tableau A contient les informations sur l’état d’une flotte d’équipements. Chaque enregistrement de statut comporte une heure de début et de fin de ce statut. Le tableau B contient des données horodatées régulièrement enregistrées sur le matériel, que je souhaite extraire pour la durée indiquée dans le tableau A.

0
KohanJ