Мне нужно написать запрос в PostgreSQL, который должен соответствовать условиям столбцов ключевых значений - PullRequest
0 голосов
/ 05 мая 2020

Представьте себе таблицу StudentDetails в формате ниже

Table Image with data

Создать запрос таблицы

 create table studentdetails (student_id bigint,key text,value text, primary key(student_id,key));
 insert into studentdetails values (1, 'class', 'class1'),(1, 'city', 'city1'),(2,'class','class2'),(2,'city','city2'),(3,'class','class2'),(3,'city','city2');

Выбрать запрос

select distinct student_id 
from studentdetails 
where ((key = 'class') 
   and (value = 'class2') 
   and (key = 'city' and value = 'city2'));

Мой требование состоит в том, чтобы получить учащихся из городов city2 и class2 (ie: student_id = (2,3)), но приведенный выше запрос возвращает 0 строк.

Примечание: я не могу изменить структуру таблицы.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Поскольку данные одного и того же студента находятся в нескольких строках, вы можете использовать простой JOIN. Например:

select a.student_id
from studentdetails a
join studentdetails b on a.student_id = b.student_id
where a key = 'class' 
  and b.key = 'city'
  and a.value = 'class2' -- searched class
  and b.value = 'city2' -- searched city
0 голосов
/ 05 мая 2020

Использовать агрегирование. Очевидно, что одна строка не может соответствовать обоим значениям:

select student_id
from studentdetails
where (key = 'class') and (value = 'class2') OR
      (key = 'city' and value = 'city2')
group by student_id
having count(distinct key) = 2;

Фильтрация студентов выполняется в предложении having, потому что вам нужно объединить значения из разных строк.

В Postgres, вы можете упростить предложение where, используя кортежи:

select student_id
from studentdetails
where (key, value) in ( ('class', 'class2'), ('city', 'city2') )
group by student_id
having count(distinct key) = 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...