Условие соединения SQL A = B или обратное к B = A? - PullRequest
2 голосов
/ 15 мая 2009

Не думаю, что это имеет какое-либо значение для базы данных, но при объединении таблиц, в каком порядке вы предпочитаете написать условие:

SELECT
    ...
    FROM AAA
        INNER JOIN BBB ON AAA.ID=BBB.ID
    WHERE ...

OR

SELECT
    ...
    FROM AAA
        INNER JOIN BBB ON BBB.ID=AAA.ID
    WHERE ...

Ответы [ 13 ]

8 голосов
/ 15 мая 2009

Я предпочитаю второй пример (B = A), потому что в соединении я перечисляю критерии, определяющие, какие строки B должны быть включены. Другими словами, я хочу, чтобы все строки из B, где «X» истинно для B. Это также согласуется, когда мне нужно проверить критерии за пределами только FK. Например:

SELECT
     some_columns
FROM
     Table_A A
INNER JOIN Table_B B ON
     B.a_id = A.a_id AND
     B.active = 1

По-моему, у меня не было бы такой же читабельности, если бы у меня было:

1 = B.active

Также рассмотрите случаи, когда критерии присоединения включают более одной таблицы:

SELECT
     some_columns
FROM
     Table_A A
INNER JOIN Table_B B ON
     B.a_id = A.a_id AND
     B.active = 1
INNER JOIN Table_C C ON
     C.a_id = A.a_id AND
     C.b_id = B.b_id AND
     C.category = 'Widgets'

Для меня это очень ясно показывает критерии, по которым следует включать строки из C.

6 голосов
/ 15 мая 2009

Я предпочитаю второй вариант, когда последняя записанная таблица стоит первой.

Я думаю, что Linq требует, чтобы все было наоборот, (вариант 1).

4 голосов
/ 15 мая 2009

Я всегда делаю

From TABLE_A A

JOIN TABLE_B B ON A.Column = B.Column
3 голосов
/ 15 мая 2009

Это не имеет значения, оба верны. Я предпочитаю второе.

Мои предпочтения основаны на идее, что таблица BBB - это таблица, которую я добавляю в набор результатов, а под рукой стоит связать столбцы (выражения) из новой таблицы BBB с другими столбцами, уже имеющимися в наборе результатов. Это может иметь больше смысла в другом примере:

SELECT ...
  FROM AAA a
  JOIN BBB b ON (b.AAA_ID = a.ID)
  JOIN CC c ON (c.AAA_ID = b.AAA_ID AND UPPER(c.FEE) IN ('FI','FO'))
  JOIN DDD d ON (d.CC_ID = c.ID AND LEFT(d.DAH,2) = c.FEE)

Да, это произвольно сложный пример, но иногда реальный код все усложняет. При ссылке на несколько предикатов в условии соединения я считаю полезным, когда каждый предикат ссылается на первые (слева) выражения из таблицы, к которой недавно присоединились.

Существуют и другие шаблоны, которые также помогают, например, когда первичный ключ каждой таблицы представляет собой один столбец с именем «ID», а столбцы с внешним ключом обычно называются PARENTTABLE_ID, например, когда я вижу конструкцию, подобную a.ID = b.ID, то, что я вижу, - это шаблон для первичного ключа, присоединенного к первичному ключу (отношение один к одному, которое не является нормативным шаблоном). И когда я вижу b.FOREIGN_ID = c.FOREIGN_ID, я вижу, что внешний ключ соединяется с внешним ключом. Опять же, это не обычный шаблон, указывающий на то, что это может быть соединение «многие ко многим» или «соединение по быстрому» для повышения производительности. Обычный шаблон, который я ищу в соединении родитель-потомок, выглядит как child.PARENT_ID = parent.ID

Эти шаблоны не правильные или неправильные, просто предпочтение. Я обнаружил, что эти шаблоны не делают код, который выглядит правильно, но делают код «странным» выделяющимся.

2 голосов
/ 15 мая 2009

Еще один мягкий голос для AAA.ID = BBB.ID. Кажется, это имеет больше смысла для меня, но это не имеет значения.

Однако, по касательной теме, я недавно начал задавать вопросы о том, как писать тесты на равенство. Я всегда предпочитал:

If ValueInQuestion = TestValue Then
...

То есть

If fullMoonsThisMonth = 2 Then
...

В чужом коде я часто видел, как этот тест переворачивался, и он какое-то время беспокоил меня. Я осознал, что мои предпочтения основаны исключительно на том, какая формулировка звучит «лучше» на английском языке, и что иногда есть веская причина для размещения инвариантного значения слева. В языках с одним оператором для проверки на равенство и присваивания (например, VB, в случае, если вы не распознали образцы ...), компилятор остановит вас от случайного назначения присваивания, когда вы намеревались выполнить тест.

2 голосов
/ 15 мая 2009

Я не думаю, что это действительно имеет значение, но я предпочитаю

INNER JOIN BBB ON AAA.ID=BBB.ID

потому что это соответствует linq.

2 голосов
/ 15 мая 2009

Я предпочитаю первый вариант. Вы переходите от A к B, поэтому порядок полей выглядит более подходящим.

1 голос
/ 15 мая 2009

Я склонен использовать оба, поскольку это не имеет никакого значения вообще.

1 голос
/ 15 мая 2009

Я использую первый синтаксис AAA.ID = BBB.ID. На мой взгляд, это облегчает чтение кода, поскольку участники присоединения следуют порядку таблиц.

1 голос
/ 15 мая 2009

Без разницы, но я бы выбрал "AAA INNER JOIN BBB ON AAA.ID = BBB.ID" для ясности (но с псевдонимами)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...