#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 |