Если имена таблиц поменяны местами при левом соединении, приведет ли это к правому соединению? - PullRequest
1 голос
/ 13 июля 2020

Рассмотрим следующую ситуацию. У нас есть две таблицы пользователей и заказов. Таблица пользователей состоит из трех столбцов: идентификатор, имя и идентификатор заказа. В таблице заказов есть два столбца: Id и order_item.

SQL запрос, чтобы получить все заказы для каждого пользователя.

 select * from users left join orders on users.order_id = orders.id;

SQL Запрос на получение всех пользователей для каждого заказа

 select * from users right join orders on users.order_id = orders.id;

Но я использую Sqlite3, который в настоящее время не поддерживает правое, полное внешнее соединение. Поэтому я попытался выполнить левое соединение с перевернутыми именами таблиц. который вроде решает мою проблему.

 select * from orders righ join users on users.order_id = orders.id;

Итак, мой вопрос в том, что если я переверну имя таблицы в левом соединении, приведет ли это к правому соединению? Конечно, правое соединение печатает столбцы таблицы в другом порядке, мой запрос выводит в другом.

Пожалуйста, помогите мне с этим подходом? сравнение с внешним соединением Real Right, недостатки и другие примечательные вещи?

Ответы [ 2 ]

1 голос
/ 13 июля 2020

RIGHT соединения используются редко. Причина в том, что соединение LEFT легче воспринимается большинством людей (мое мнение, хотя, возможно, люди, использующие RTL-запись, могут не согласиться).

Если вам нужны все строки таблицы 1 и любые совпадающие строки таблицы 2, обычно вы думаете о наборе результатов, в котором слева от результатов есть столбцы таблицы 1 и в правой части столбцы таблицы 2.

Итак, вы пишете:

SELECT * FROM Table1 LEFT JOIN Table2 ON <condition>

Это точно так же, как:

SELECT * FROM Table2 RIGHT JOIN Table1 ON <condition>

Конечно, правое объединение печатает столбцы таблицы в другом порядке. запрос выводит разные

Вы должны явно указать порядок столбцов в результатах. Поэтому вместо SELECT *, если вы хотите, чтобы сначала столбцы таблицы 2 напишите:

SELECT Table2.*, Table1.* ....

или, если вам не нужны все столбцы, перечислите все столбцы, которые вы хотите:

SELECT Table2.col1, Table2.col2, ...., Table1.col1, ....

Конечно, рекомендуется использовать псевдонимы, чтобы сделать код короче, чтобы ваш запрос можно было записать:

SELECT o.*, u.* 
FROM orders AS o LEFT JOIN users AS u
ON u.order_id = o.id;
1 голос
/ 13 июля 2020

Если есть только две таблицы, тогда да.

Чем больше таблиц, тем сложнее. Запросы не совсем такие же, но в большинстве случаев они совпадают. Эквивалент:

from a left join b left join c

:

from c right join (b right join a) 

Проблема заключается в порядке, в котором интерпретируются join s. Итак, первая версия:

from (a left join b) left join c

, и она немного отличается от:

from a left join (b left join c)

в зависимости от условий.

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