Ссылка на вложенный запрос в нескольких условиях

#mysql #sql #subquery

#mysql #sql #подзапрос

Вопрос:

У меня есть одна таблица, которая называется employees :

 id     |    name    |    born    |    stinky
-------------------------------------------------
1          Chris        1982            1
2          Chris        1982            1
3           Bob         1982            0
4          Chris        1982            1
 

Я хочу захватить строки 2, 4 на основе следующего условия:

 SELECT 
    id,name,born,stinky
FROM
    employees
WHERE
    name=(SELECT name FROM employees WHERE id=1)
        AND
    born=(SELECT born FROM employees WHERE id=1)
        AND
    stinky=(SELECT stinky FROM employees WHERE id=1)
        AND
    id != 1
 

Есть ли способ оптимизировать это, чтобы выполнить только один подзапрос, а затем ссылаться на данные подзапроса несколько раз? Например, что-то вроде этого:

 SELECT 
    id,name,born,stinky
FROM
    employees
SUBQUERY
    (SELECT name FROM employees WHERE id=1) AS XX
WHERE
    name=XX.name
        AND
    born=XX.born
        AND
    stinky=XX.stinky
        AND
    id != 1
 

Комментарии:

1. Посмотрите на оператор СОЕДИНЕНИЯ

2. Я знаком с JOIN , но это правильный способ сделать это? Я видел CROSS APPLY , LATERAL , и т.д…

3. Исправлено @forpas

Ответ №1:

Вы можете использовать подзапрос только один раз:

 SELECT id,name,born,stinky
FROM employees
WHERE (name,born,stinky) = (SELECT name,born,stinky FROM employees WHERE id=1)
  AND id <> 1
 

Другой способ сделать это — с помощью объединения:

 SELECT e.id,e.name,e.born,e.stinky
FROM employees e
INNER JOIN (SELECT * FROM employees WHERE id=1) t
ON (t.name,t.born,t.stinky) = (e.name,e.born,e.stinky) AND t.id <> e.id
 

Смотрите демонстрацию.
Результаты:

ID Имя родился вонючий
2 Крис 1982 1
4 Крис 1982 1