Как я могу переписать запрос без использования объединений - PullRequest
2 голосов
/ 15 апреля 2009

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

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 делает объединения невероятно трудными.

Ответы [ 8 ]

12 голосов
/ 15 апреля 2009

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

SELECT * FROM table1, table2 WHERE table1.id = table2.id AND ...
2 голосов
/ 15 апреля 2009

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

1 голос
/ 15 апреля 2009

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

0 голосов
/ 15 апреля 2009

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

0 голосов
/ 15 апреля 2009

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

0 голосов
/ 15 апреля 2009

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

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

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

0 голосов
/ 15 апреля 2009

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

SELECT e.Name, e.HireDate, (select SUM(CheckAmount) from EmployeeCheck where EmployeeID = e.ID) 
FROM Employee e
0 голосов
/ 15 апреля 2009

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

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

Это вам не поможет.

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

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

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

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