Я смотрю на этот старый запрос SQL. Бит, который я не могу получить, - это то, почему он дважды соединяет одну и ту же таблицу в одних и тех же столбцах. Я говорю о Table1 и Table1, связанных с псевдонимом «Table1Alias»,
SELECT DISTINCT othercolumns,
Table1Alias.columna
FROM maintable
INNER JOIN secondarytable
ON maintable.id1 = secondarytable.a_id1
INNER JOIN table1
ON secondarytable.id2 = table1.id3
INNER JOIN table1 Table1Alias
ON secondarytable.id2 = Table1Alias.id3
INNER JOIN thirdtable
ON table1.id4 = thirdtable.id5
INNER JOIN fourthtable
ON thirdtable.id6 = fourthtable.id7
INNER JOIN fivetable
ON thirdtable.id8 = fivetable.id9
INNER JOIN sixthtable
ON Table1Alias.columna = sixthtable.id10
LEFT JOIN seventhtable
ON thirdtable.id11 = seventhtable.id12
WHERE LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09'
AND secondarytable.type456 = 'cate'
AND table1.type = '0'
AND Table1Alias.columna = 'conn'
sql-server
Математика
источник
источник
Ответы:
Это может помочь переписать запрос следующим образом, поэтому очевидно, что эти 2 объединения различны , т.е. объединения относятся к разным подмножествам (одной и той же таблицы):
источник
INNER JOIN (SELECT * FROM table1 WHERE type = 0) table1
. Это может сделать еще более очевидным, что происходит.ON
предложении объединения или вWHERE
предложении, может иметь большое значение, если это объединениеOUTER JOIN
. Если условие не выполнено вON
предложении, основная строка все еще включается (без соответствующей внешней строки); если это не удается вWHERE
предложении, то основная строка исключается из результирующего набора.Глядя на
where
предложение, для строки, на которую указывает строка,table1
требуется столбецtype
= 0, а для строки, на которую указывает строка,table1alias
требуется столбецcolumna
= = conn.Возможно, есть несколько строк
table1
для одного и того жеid3
?источник
Не видя структуру таблицы - подход может заключаться в том, чтобы использовать меньший не покрывающий индекс и затем объединять в таблицу по большему покрывающему индексу, чтобы получить остаток строк, чтобы избежать операции «Поиск по ключу» и избежать изменения существующих индексов. (или если вы не можете изменить индексы)
источник
Всякий раз, когда таблица появляется более одного раза в сложном соединении, обычно это происходит потому, что существует сущность, которая участвует в нескольких отношениях. Это, кажется, имеет место здесь, судя по ответу, который дал @Ypercube.
Сущности и отношения обычно понимаются через семантику данных и связь с основным предметом. Если ваша устаревшая система была тщательно построена, они, вероятно, позаботились о том, чтобы проанализировать предмет и тщательно определить каждый из элементов данных. Возможно, они даже создали модель сущности-отношения. Вся эта тщательная работа, возможно, была потеряна, и вы застряли, восстанавливая ее, копаясь в прошлом. Это немного похоже на археологию.
С такими именами таблиц, как Table1, мы не имеем понятия о том, как работает ваша тема. И даже если названия носят описательный характер, наше понимание предмета вашей системы может сильно отличаться от того, что необходимо в вашем случае. Это будет зависеть от вас.
источник