Сопоставление одного столбца с несколькими значениями без самостоятельной таблицы в POSTGRES - PullRequest
0 голосов
/ 04 марта 2020

Я хочу выбрать routing_id, у которого routing_id = 489.

Я использую SQL подзапрос, но это снижает производительность.

Запрос: -

select routing_id 
from ec.production_autoroutingtag 
where tag_type = 'mounting_type' 
  AND tag_value='smd' 
  and routing_id in (select routing_id 
                     from ec.production_autoroutingtag 
                     where tag_type = 'x_ray' 
                       AND tag_value='true'
                       and routing_id in (select routing_id  
                                          from ec.production_autoroutingtag 
                                          where tag_type = 'depaneling' 
                                            AND tag_value='false'
                                         )
                    )

Это работает нормально, но что, когда количество строк больше, пожалуйста, дайте мне лучшие решения.

Заранее спасибо.

enter image description here

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Похоже

SELECT routing_id
FROM ec.production_autoroutingtag
WHERE (tag_type, tag_value) IN (('mounting_type', 'smd'),
                                ('x_ray', 'true'),
                                ('depaneling', 'false'))
GROUP BY routing_id
HAVING COUNT(DISTINCT tag_type, tag_value) = 3

ОБНОВЛЕНИЕ

Если вам нужно проверить значение с условием, отличным от равенства, то вы должны проверить каждую пару (тэг, значение), отдельно комбинирующее условия с ИЛИ:

SELECT routing_id,
       COUNT( tag_type) 
FROM ec.production_autoroutingtag 
WHERE (tag_type, tag_value) IN (('mounting_type','qfn'), ('panel_qty','1')) 
   OR (tag_type = 'bom' and tag_value >= '10')
   OR (tag_type = 'cpl' and tag_value >= '158')
GROUP BY routing_id 
HAVING COUNT(tag_type) = 4; 

Обратите внимание - сравнение «больше или равно» будет выполнено как СТРОКИ (т. е. «5» даст ИСТИНА)! если вам нужно сравнить как числа, вы должны использовать правильное преобразование типов для значений полей и правильный тип данных для ссылочного значения:

SELECT routing_id,
       COUNT( tag_type) 
FROM ec.production_autoroutingtag 
WHERE (tag_type, tag_value) IN (('mounting_type','qfn'), ('panel_qty','1')) 
   OR (tag_type = 'bom' and tag_value + 0 >= 10)
   OR (tag_type = 'cpl' and tag_value + 0 >= 158)
GROUP BY routing_id 
HAVING COUNT(tag_type) = 4; 
0 голосов
/ 04 марта 2020

Возможно, вам не хватает индексации, вы можете добавить ее в свою таблицу следующим образом:

CREATE INDEX keep_name_of_index ON table_name(column_name);

добавить это ко всем столбцам, которые вы добавляете в предложении where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...