2013-10-03 4 views
0

У меня есть 3 стола. Таблица 1 и 2 разделяют столбцы 1 и 2. Все 3 таблицы разделяют столбец 2 (столбец идентификатора), но только таблица 3 содержит столбец 3. Я хочу, чтобы все строки, где таблицы 1,2 имели равные значения для столбцов 1 и 2, но только где table3.Col3 (присоединенный к столбцу ID 2) равен некоторому определенному значению «X».Являются ли эти два запроса mysql одинаковой функциональностью?

У меня есть два запроса, которые появляются быть идентичны и работают для того, что я хочу, но я прошу экспертов, чтобы убедиться, что они являются взаимозаменяемыми:

SELECT * 
from Table1 INNER JOIN Table2 
ON Table1.Col1 = Table2.Col1 and Table1.Col2 = Table2.Col2 
WHERE (Select Col3 from Table3 where Table2.Col2 = Table3.Col2) = "X" 

SELECT * 
from Table1 INNER JOIN Table2 
ON Table1.Col1 = Table2.Col1 and Table1.Col2 = Table2.Col2 
INNER JOIN Table3 
ON Table1.Col2 = Table3.Col2 
WHERE Table3.Col3 = "X" 
+2

Невозможно сказать, не зная количества задействованных строк и описания таблицы. – Nikhil

+2

Сравните время выполнения ..? –

+0

Являются ли они идентичными по функциональности? Отредактировал мой вопрос, чтобы удалить вопрос о времени. – Tommy

ответ

1

я собираюсь сказать да они эквивалентны, и попробуйте дать объяснение.

первый запрос:

1-й INNER JOIN будет выбирать только строки из Table1 и Table2, где оба Col1 и Col2 матча. Подзапрос на самом деле является коррелированным подзапросом, который будет выполняться для каждой строки внешнего подзапроса, что означает, что каждая строка фильтруется INNER JOIN. Кроме того, вы фильтруете внешний запрос по результатам внутреннего запроса, где Col3 от Table3 = 'X'. Это дает вам именно нужные вам данные.

2-й запрос:

Немного отличается. 1-й INNER JOIN работает так же, как и в случае 1. Однако тогда вы получите INNER JOIN этот результирующий набор с таблицей 3. Опять же, вы только присоединяетесь к строкам, где Table1.Col2 = Table3.Col2. И, начиная с Table1.Col2 = Table2.Col2, это приводит к эквивалентному промежуточному набору результатов, определенному коррелированным подзапросом в первом случае. Наконец, вы фильтруете на Table3.Col3 = 'X', что снова приводит к точному набору данных, как вы хотели.

Надеюсь, что это имеет смысл. Поправьте меня, если моя логика ошибочна.

+0

Обратите внимание, что «SELECT *» возвращает разные столбцы для этих запросов. И подзапрос «Select Col3 из Table3, где Table2.Col2 = Table3.Col2» в первом запросе предполагает, что он вернет не более 1 строки. – miazo

+0

@miazo Отличная точка. Я полностью проигнорировал первую часть запросов. – Nikhil

Смежные вопросы