Значение в одном ИЛИ другом столбце

bjar-bjar спросил: 28 марта 2018 в 02:07 в: sql

Следующий код - просто упрощенное описание, из-за набора данных структура запроса должна быть таким образом.

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

Это то, что у меня есть сейчас:

SELECT * FROM PEOPLE WHERE RELATION = 'child' 
and (
    'John' IN (SELECT FIRSTNAME FROM PEOPLE WHERE AGE = 20 AND RELATION = 'parent' ) OR 
    'John' IN (SELECT ALIAS FROM PEOPLE WHERE AGE = 20 AND RELATION = 'parent')
) ;

Я выяснил, что OR дает очень плохую производительность.

То, что я хочу достичь, это что-то вроде:

SELECT * FROM PEOPLE WHERE RELATION = 'child' AND 'John' IN 
(SELECT FIRSTNAME, ALIAS FROM PEOPLE WHERE AGE = 20 AND RELATION = 'parent');

Первое имя и псевдоним в этом примере не обязательно одно и то же значение, поэтому я не могу использовать:

SELECT * FROM PEOPLE WHERE RELATION = 'child' AND ('John','John') IN 
(SELECT FIRSTNAME, ALIAS FROM PEOPLE WHERE AGE = 20 AND RELATION = 'parent');

Так как это только найдет, в котором FIRSTNAME = ALIAS = 'John'.

Есть ли лучший способ сделать это, чем то, как это делается сейчас?


1 ответ

Есть решение
Kaushik Nayak ответил: 28 марта 2018 в 03:22

Может быть что-то вроде этого?

SELECT * 
FROM   people 
WHERE  relation = 'child' 
       AND EXISTS (SELECT 1 
                   FROM   people 
                   WHERE  age = 20 
                          AND relation = 'parent' 
                          AND ( firstname = 'john' 
                                 OR alias = 'john' )) ;
bjar-bjar ответил: 28 марта 2018 в 04:25
Логически это дает то же самое. И это идет быстрее на моем большом наборе данных, чем решение, которое я придумал. Спасибо.