Есть ли какой-нибудь запрос, чтобы найти эту информацию об идентификаторе? - PullRequest
0 голосов
/ 13 июля 2020

Это образец моей таблицы:

+--------+-------+-----+
|  name  | value | id  |
+--------+-------+-----+
| value1 |     1 | 100 |
| value2 |     2 | 100 |
| value1 |     1 | 200 |
| value2 |     3 | 200 |
| value1 |     1 | 300 |
| value2 |     4 | 300 |
|        |       |     |
+--------+-------+-----+

Как настроить запрос SQL для получения id значения 100 для заданных value1 = 1 и value2 = 2?

Ответы [ 4 ]

2 голосов
/ 13 июля 2020

Если я правильно понимаю, агрегирование с предложением having делает то, что вы хотите:

select id
from t
group by id
having count(*) filter (where name = 'value1' and value = 1) = 1 and
       count(*) filter (where name = 'value2' and value = 2) = 1 ;

   
1 голос
/ 13 июля 2020

Случай . См .:

Этот запрос обычно более эффективен , чем было предложено до сих пор:

SELECT id
FROM  (SELECT id FROM tbl WHERE name = 'value1' AND value = 1) t1
JOIN  (SELECT id FROM tbl WHERE name = 'value2' AND value = 2) t2 USING (id);

Или эквивалент (результат идентичный план запроса):

SELECT id
FROM   tbl t1
JOIN   tbl t2 USING (id)
WHERE  t1.name = 'value1' AND t1.value = 1
AND    t2.name = 'value2' AND t2.value = 2;

db <> fiddle здесь

Не обеспечивает уникальность в запросе (как это делают другие ответы), поскольку я предполагаю, что одно или несколько ограничений в таблице уже делают это.

Имейте «покрывающий» индекс для (name, value, id). Возможны оптимизированные варианты индекса, в зависимости от вашего нераскрытого определения таблицы.

Но сначала пересмотрите свой реляционный дизайн, если вы в состоянии изменить его. Модели EAV обычно неоптимальны. См .:

1 голос
/ 13 июля 2020

Сгруппируйте по идентификатору и установите условие в предложении Have:

select id
from tablename
where (name, value) in (('value1', 1), ('value2', 2))
group by id
having count(distinct value) = 2 

См. demo .

0 голосов
/ 13 июля 2020

SELECT id из TABLE_NAME WHERE value IN (1, 2);

Это будет извлекать столбец id из вашей таблицы, когда значение столбец равно 1 или 2

...