Выбрать из одной таблицы критерии соответствия в другой? - PullRequest
40 голосов
/ 27 марта 2011

Я бы очень признателен за помощь с SQL-запросом к таблицам. Я понимаю, что такие вещи задают постоянно, но я не могу найти достаточно похожий вопрос, чтобы понять смысл ответов.

Я хочу выбрать строки из table_A, которые имеют соответствующий тег в table_B.
Так, например, «выбрать строки из table_a, помеченные как« стул »», вернет table_C.

Кроме того, id является уникальным в table_a, а не в 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

В качестве альтернативы, есть ли лучший способ организовать данные?

Ответы [ 4 ]

91 голосов
/ 27 марта 2011

Простейшим решением будет коррелированный подвыбор :

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

В качестве альтернативы вы можете объединить таблицы и отфильтровать нужные вам строки:

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

Вы должны профилировать оба и посмотреть, что быстрее в вашем наборе данных.

8 голосов
/ 27 марта 2011

Вы должны сделать теги своей таблицей со связующей таблицей.

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
3 голосов
/ 27 марта 2011
select a.id, a.object
from table_A a
inner join table_B b on a.id=b.id
where b.tag = 'chair';
0 голосов
/ 25 мая 2018

У меня похожая проблема (по крайней мере, я думаю, что она похожа). В одном из ответов здесь решение выглядит следующим образом:

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

Это предложение WHERE, которым я хотел бы быть:

WHERE B.tag = A.<col_name>

или, в моем конкретном случае:

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

Подробнее:

Таблица A содержит информацию о состоянии парка оборудования. Каждая запись состояния содержит время начала и окончания этого состояния. В таблице B регулярно записываются данные об оборудовании с метками времени, которые я хочу извлечь за период, указанный в таблице A.

...