Устранить повторяющиеся левые соединения SQL - PullRequest
0 голосов
/ 19 апреля 2020
Table1:
UID (PK), Root_ID (FK), Branch_ID (FK), Leaf_ID (FK)

Table2:
ID (PK), Name

Я хотел бы присоединить идентификатор в таблице 2 ко всем 3 столбцам в таблице 1, чтобы узнать его имя. Мой текущий код:

SELECT X.Name, Y.Name, Z.Name
FROM Table1 AS XX
LEFT JOIN Table2 AS X ON X.ID = XX.Root_ID
LEFT JOIN Table2 AS Y ON Y.ID = XX.Branch_ID
LEFT JOIN Table2 AS Z ON Z.ID = XX.Leaf_ID

Чувствую, что должен быть лучший способ сделать это и надеялся, что кто-то может указать мне правильное направление!

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

В вашем запросе нет ничего плохого. Если вы стремитесь получить first_rows максимально быстро, то может быть (сравните его) лучше использовать (выберите в select следующим образом). (Например, если это веб-страница, на которой вы хотите, чтобы пользователь показывал записи в таблице нумерации страниц). Но это будет зависеть от количества записей, которые вы получили в таблице 1. Для нескольких строк я бы все равно go использовал подход с левым соединением, который у вас изначально был.

Если бы с другой стороны была обработка, выполняемая для ВСЕХ строк (например, задание ETL , который должен работать со всеми записями в таблице 1), тогда подход с левым соединением является лучшим.

Следует обратить внимание на то, установлены ли у вас fkey-ограничения для root_id, branch_id, leaf_id

SELECT (select name from table2 where id=xx.root_id) as root_name
       ,(select name from table2 where id=xx.branch_id) as branch_name 
       ,(select name from table2 where id=xx.leaf_id) as leaf_name
  FROM Table1 AS XX
0 голосов
/ 19 апреля 2020

Вы можете написать это как:

SELECT X.Name, 
CASE X.ID 
 WHEN Root_ID THEN XX.Root_Name 
 WHEN Branch_ID THEN Branch_Name 
 WHEN Leaf_ID THEN Leaf_Name 
END AS [Entity_Name]
FROM Table1 AS XX
LEFT JOIN Table2 AS X 
ON (X.ID = XX.Root_ID OR X.ID = XX.Branch_ID OR X.ID = XX.Leaf_D )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...