Как оптимизировать этот SQL-запрос (из C #) - PullRequest
1 голос
/ 26 января 2009

Я новичок в программировании БД и мне нужна помощь по оптимизации этого запроса:

Учитывая таблицы A, B и C, и меня интересует один столбец из каждого из них, как написать запрос так, чтобы я мог получить один столбец из каждой таблицы в 3 различных массива / списка в моем коде C #? *

В настоящее время я выполняю три разных запроса к БД, но хочу выполнить то же самое в одном запросе (чтобы сохранить 2 поездки в БД).

Ответы [ 5 ]

0 голосов
/ 26 января 2009

@ patmortech Используйте UNION ALL вместо UNION, если вам не нужны дубликаты значений или если вы можете получить только уникальные значения (потому что вы запрашиваете через первичные или уникальные ключи). Гораздо быстрее производительность с UNION ALL.

В SQL нет смысла "массивов". Есть таблицы, строки и столбцы. Результирующие наборы возвращают набор строк и столбцов. Можете ли вы привести пример того, что вы ищете? (Было бы полезно использовать DDL исходных таблиц и примеров данных.)

Как уже говорили другие, вы можете отправлять несколько запросов на сервер в рамках одного оператора execute и возвращать несколько наборов результатов через ADO.NET. Вы используете команду DataReader .NextResult (), чтобы вернуть следующий набор результатов.

Смотрите здесь для получения дополнительной информации: MSDN

Раздел: Получение нескольких наборов результатов с помощью NextResult

Вот пример кода:

static void RetrieveMultipleResults(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM dbo.Categories;" +
          "SELECT EmployeeID, LastName FROM dbo.Employees",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        while (reader.HasRows)
        {
            Console.WriteLine("\t{0}\t{1}", reader.GetName(0),
                reader.GetName(1));

            while (reader.Read())
            {
                Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0),
                    reader.GetString(1));
            }
            reader.NextResult();
        }
    }
}
0 голосов
/ 26 января 2009

Пройдите три поездки. Ответы на данный момент показывают, как далеко вы должны перейти от «нового к программированию БД», чтобы делать то, что вы хотите. Сначала освоите самые простые способы.

Если это три огромных результата, то я подозреваю, что вы пытаетесь сделать что-то в C #, что было бы лучше сделать в базе данных SQL без возврата данных. Без подробностей это звучит подозрительно как антипаттерн.

0 голосов
/ 26 января 2009

Вы можете сделать 3 различных оператора SELECT и выполнить их за 1 вызов. Вы получите 3 набора результатов назад. То, как вы используете эти результаты, зависит от того, какую технологию данных вы используете. LINQ? Datasets? Адаптер данных? Читатель данных? Если вы сможете предоставить эту информацию (возможно, даже пример кода), я точно скажу, как получить то, что вам нужно.

0 голосов
/ 26 января 2009

Не уверен, что это именно то, что вы имели в виду, но вы можете сделать что-то вроде этого (если все три столбца имеют одинаковый тип данных):

select field1, 'TableA' as TableName from tableA
UNION
select field2, 'TableB' from tableB
UNION
select field3, 'TableC' from tableC

Это даст вам один большой набор результатов со всеми записями. Затем вы можете использовать считыватель данных, чтобы прочитать результаты, отследить, каково было значение TableName предыдущей записи, и всякий раз, когда оно изменяется, вы можете начать помещать значения столбца в другой массив.

0 голосов
/ 26 января 2009

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

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