2012-02-23 2 views
1

У меня есть два разных SQL-запроса, которые мне нужно запустить сразу. Но поскольку я использую внутренние соединения в обоих из них, я не могу просто присоединиться к ним. Есть ли способ сделать это? Кроме того, как вы думаете, что нормализация может вызвать проблемы? неSQL Server, выполняющий несколько запросов как один запрос

SELECT S.SchoolName,Sd.DepartmentName,E.GraduationDate 
FROM Education E 
      INNER JOIN SchoolDepartment Sd ON Sd.DepartmentID = E.DepartmentID 
      JOIN School S ON S.SchoolID = Sd.SchoolID 

SELECT c.CompanyName,dt.DepartmentName, pl.PositionLevelName 
FROM Employee Ee 
      INNER JOIN Position P ON Ee.PositionID = P.PositionID 
      JOIN Company c ON c.CompanyID = P.CompanyID 
      JOIN Department De ON De.DepartmentID=P.DepartmentID 
      JOIN DepartmentType dt ON dt.DepartmentName = De.DepartmentTypeID 
      JOIN PositionLevel pl ON pl.PositionLevelID=P.PositionLevelID  
+0

Абсолютно ничего плохого в нескольких запросах на странице. Эти 2 вопроса, вероятно, занимают менее секунды. Но если вы действительно хотите сэкономить время, займитесь с JonH и сделайте UNION – Induster

ответ

1

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

Есть несколько стратегий, которые вы можете использовать, если наборы на самом деле не связаны в этом смысле.

  1. Сделать один хранимую процедуру или партии как в одной и той же командой, которая возвращает оба результирующих наборов в последовательности и использовать функцию ADO.NET, чтобы получить следующий результат, установленный на читателя.

  2. Сделайте два последовательных вызова в базе данных.

  3. Использование асинхронных функций ASP и ADO для двух одновременных вызовов в базу данных и обработки завершений - это может быть полезно для сайтов с большим объемом, поскольку управление возвращается на страницу после их завершения, освобождая потоки.

0

Если поля одного и того же типа данных (столбцы в запросе 1 матч тот же тип данных запроса 2), вы можете использовать UNION объединить оба запроса, в противном случае его невозможно, если вы не можете присоединиться к ним ,

+0

. Я имею в виду, как facebook извлекает всю информацию пользователя сразу при загрузке страницы? Мне нужно что-то подобное – Codette

+0

@tfeseas - Не сравнивайте свою работу с работой facebook. Facebook имеет сотни сотрудников. В любом случае я не работаю для facebook, поэтому я не знаю, как выглядит их база данных. Они могут хранить информацию профиля в различных таблицах, но имеют связь через отношения pk fk. И чьими словами они не делают несколько обращений к базе данных в разное время - они, вероятно, это делают. – JonH

+0

Я работаю на нескольких страницах с десятками запросов ... это просто факт жизни. – Induster

3

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

На ваш комментарий: Я уверен, что Facebook запрашивает несколько магазинов, когда загружает вашу страницу профиля, но они активно используют кэширование данных, поэтому они могут кэшировать объекты вашего профиля, чтобы уменьшить удаленные базы данных.

+0

, но до того, как они кэшируются, они получают данные из базы данных. Кэширование - это еще одна вещь, но для ее кеширования мне нужно получить их, и я прошу, чтобы я создал процедуры, которые открывают/извлекают/закрывают соединение или есть лучший способ сделай это? – Codette

+0

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

+2

То, что я пытаюсь сказать, заключается в том, что да, выполнение нескольких запросов может быть более дорогостоящим в большинстве случаев, чем выполнение одного запроса, но это не значит, что вы должны создать какое-то ужасно сконструированное сочетание, чтобы избежать выполнения двух запросов, когда это ясно делает смысл. Пока вы используете одно и то же соединение, это будет достаточно. – swannee

0

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

Обратите внимание, что я отвечаю на ваш вопрос - большинство других не похоже.

У меня есть два различных запросов SQL, что мне нужно сразу бежать

Это не то, как он работает в SQ LServer. Если вы пишете thm в одну партию, они все равно выполняются один за другим, а не в одно и то же время. Не уверен, что для них разумно работать одновременно, но это то, о чем вы просите.

Но у меня есть программное обеспечение, которое делает сотни SQL одновременно с достаточно мощным сервером аппликации (24 ядра), достаточно мощным Oracle RAC (48 ядер на двух машинах с гиперпотоком = 96 параллельных потоков).

0

Я пытаюсь сделать что-то подобное. Я на самом деле пытаюсь сгруппировать строки по нескольким критериям, которые различаются в один набор данных.То, что я делаю, это запрашивать все данные в таблице temp, а затем запрашивать эту временную таблицу в разных представлениях, а затем объединять ее. Таким образом, он показывает разные виды. Например. Строка 1 включает cat1 cat2 и cat3. Строка 2 - это только cat 2 и cat 3. И строка 3 - Cat1 - cat8. Данные все равно одни и те же фрагменты. Таким образом, многократная поездка в базу данных для запроса не стоит накладных расходов. Я могу запросить temp несколько раз, чтобы получить мои фрагменты, а затем объединить их в один вид. Альтернативно, если вам нужны эти представления, и они меняются, вы можете создать таблицу с группами, которые вы хотите, от одного до многих. С помощью этого трехуровневого подхода вы можете присоединиться и получить суммы за один шаг.

Смежные вопросы