Как я могу переписать запрос без использования соединений

StackOverflow https://stackoverflow.com/questions/752673

  •  09-09-2019
  •  | 
  •  

Вопрос

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

SELECT
    *
FROM
(
    table1
INNER JOIN
    table2
ON
    table1.id = table2.id
)
INNER JOIN
    table3
ON
(
    table1.id2 = table3.id2
)
AND
(
    table1.id3 = table3.id3
)
WHERE
    table1.id = 1

Причина, по которой я не могу использовать соединения, заключается в том, что приложение использует HQL, а не стандартный SQL, а HQL делает соединения невероятно трудными.

Это было полезно?

Решение

Невозможно извлечь данные из двух разных таблиц, не соединив их тем или иным способом.Вы используете оператор JOIN, НО вы можете добиться того же, поместив его, например, в предложениеwhere:

SELECT * FROM table1, table2 WHERE table1.id = table2.id AND ...

Другие советы

Вы можете делать выборки отдельно и выполнять соединения внутри приложения.

Если соединения запрещены, держитесь подальше от баз данных SQL.

часто подзапрос может быть проще, чем соединение, если выбрать только 1 значение

SELECT e.Name, e.HireDate, (select SUM(CheckAmount) from EmployeeCheck where EmployeeID = e.ID) 
FROM Employee e

Не буду пуристом, но основной концепцией реляционных баз данных и нормализации данных является объединение.Без этого нет смысла использовать реляционную базу данных для хранения данных.Индексы позволяют сделать это быстро и эффективно.

Старый способ заключался в использовании главной таблицы и таблицы транзакций.Назад в темные века.

Однако вы можете использовать курсор для фильтрации, которую будет выполнять соединение.Курсор работает как массив по таблице, а не как фильтр на основе соединения, и дает тот же результат.

Если хотите, вы можете сделать это с помощью коррелированных подзапросов, но лучше использовать объединения.

Hibernate не мешает вам выполнять соединения, если у вас есть сопоставление ассоциаций в файле карты спящего режима.См., например: http://www.jumpingbean.co.za/blogs/mark/hibernate_hql_inner_join_on_clause

SQL без объединений...

SELECT * FROM table1
SELECT * FROM table2
SELECT * FROM table3

Хотя это вам не поможет.

Вопрос в том, каков ваш желаемый результат и какие у вас есть причины не желать присоединяться?

Если вам нужны данные из нескольких таблиц в реляционной базе данных, вам придется объединить данные.Возможно, это то, что вам нужно сделать в приложении, как предложил Джеймс Блэк.

Если бы вы могли пролить больше света на ситуацию, мы могли бы помочь дальше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top