Я прочитал несколько потоков здесь подзапрос повторного использования, но не смог найти удовлетворительный ответ на мой вопрос: Предполагая следующую таблицу темпа (в MySQL):MySQL Повторного использование подзапросов
+------+---+----+
| Y | M | V |
+------+---+----+
| 1995 | 0 | 3 |
| 1995 | 1 | 16 |
| 1995 | 4 | 18 |
| 2025 | 0 | 4 |
| 2025 | 2 | 13 |
+------+---+----+
Я хотел бы создать новый столбец X, который копирует V из строки, где М равно 0 во всех строках с одинаковым Y (ухо), например:
+------+---+----+------+
| Y | M | V | X |
+------+---+----+------+
| 1995 | 0 | 3 | 3 |
| 1995 | 1 | 16 | 3 |
| 1995 | 4 | 18 | 3 |
| 2025 | 0 | 4 | 4 |
| 2025 | 2 | 13 | 4 |
+------+---+----+------+
Это может быть сделано, как это :
SELECT Y, M, V,
(SELECT V FROM temp WHERE temp.Y = t.Y AND M = 0) AS X
FROM temp t;
или как это:
SELECT temp.Y, temp.M, temp.V, q2.V AS X
FROM temp
JOIN (SELECT * FROM temp WHERE M = 0) q2 USING (Y);
Для целей этого упражнения можно предположить, что температура содержит только один М = 0 для каждого Y (ухо).
Проблема в том, что temp на самом деле не таблица, а результат сложного запроса. Замена temp на фактический запрос громоздка, и производительность, вероятно, будет плохой, если только MySQL не станет достаточно умным, чтобы обнаружить, что две конструкции идентичны.
Нет предложения WITH в MySQL, есть ли способ генерировать X без необходимости ссылаться на temp дважды; т. е. является подзапросом, действительно необходимым для этой проблемы?
Код, в конечном счете, будет запущен внутри S-PROC, поэтому я мог бы создать временную таблицу памяти, но мне интересно, есть ли более элегантное решение.
Как вы уже выяснили, mysql не поддерживает Common Table Expressions, как бы то ни было, чего вы пытаетесь достичь, возможно, с вложенными подзапросами. – e4c5
будет иметь вид справки, это не таблица, но действует как один в запросах – davejal
Thx. У меня ограниченный опыт просмотра. Не уверены, могут ли они принимать переменные, поскольку сложный запрос зависит от параметра. – Matthias