callasda Ответов: 1

C# как написать заголовок и подробный запрос


У меня есть форма и 2 sql-таблицы. Таблица 1 содержит информацию о заголовке и подробную информацию о таблице 2
Кнопка, запускающая процесс записи данных из таблиц в приложение.

private void button1_Click(object sender, EventArgs e)
{
    using (SqlCommand cmd =  new SqlCommand(@SELECT col1,col2,col3,col4 FROM tbl1,conn))
    using (var rdr = cmd.ExecuteReader())
    {
    while (rdr.Read())
    {
    writeHeadData(rdr["col1"], rdr["col2"], rdr["col3"], rdr["col3"],rdr["col4"]);
    }
}


private void writeHeadData(string col1,string col2,string col3,string col4)
{
	//do something here (writeHeadData)
	writeDetailData(col1, col2, col3, col4)
}

private void writeDetailData(string col1,string col2,string col3,string col4)
{
	//do something here with data from the details table
}

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

using (SqlCommand cmd =  new SqlCommand(@SELECT * FROM tbl2,conn))
using (var rdr = cmd.ExecuteReader())
while (rdr.Read())
{
writeHeadData(rdr["col1"], rdr["col2"], rdr["col3"], rdr["col3"],rdr["col4"]);
}

Для каждой строки заголовка есть 3 строки сведений

Я надеюсь, что тот, кто читает это, понимает, чего я пытаюсь достичь, и если не ясно, пожалуйста, скажите мне, и я постараюсь объяснить дальше

Что я уже пробовал:

Создание вложенной время. Повторите один и тот же запрос в обоих разделах. Попробовал использовать одну таблицу

1 Ответов

Рейтинг:
0

Eric Lynch

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

Самый эффективный способ объединить информацию из этих двух таблиц - использовать внутренний оператор JOIN. Это приведет к некоторому дублированию в результирующем наборе, который вы можете легко отфильтровать на стороне клиента с помощью кода (например, поиск изменения значения "commonColumn"). Дублирование будет происходить из значений столбцов, из таблицы заголовков, повторяющихся для каждой из трех строк сведений.

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

Чтобы соединить две таблицы с помощью команды SELECT, просто выполните следующие действия:

Выберите заголовок.*, подробности.* Из заголовка внутреннее соединение деталей на детали.commonColumn=заголовок.commonColumn

В приведенном выше примере предполагается, что у вас есть таблица с именем "header", таблица с именем "details" и общий столбец с именем "commonColumn". Примечание: имя общего столбца может быть разным в двух таблицах, если значение столбца одно и то же.

Сокращение " header.* "может быть использовано для ссылки на все столбцы таблицы"header". Аналогично, ярлык " details.* "используется для ссылки на все столбцы таблицы"details".

На самом деле предпочтительнее перечислить каждый столбец, который вы действительно хотите включить в запрос. Так, например, вместо заголовка".*", список заголовков".commonColumn, заголовок.этой статьей".

Ваш результирующий набор будет выглядеть примерно так:

commonColumn someDetailColumn
id1 detail1
id1 detail2
id1 detail3
detailA ID2, которое
ID2, которое detailB
ID3 detailC

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

Надеюсь, это поможет.


callasda

Спасибо Эрик
Объясню по-другому. У меня есть 2 стола. Порядок и детали порядка. Хозяин и дитя. Поэтому заказ заголовка информация будет идти внутри метода "writeHeadData" и подробностей заказа информация будет идти внутри метода "writeDetailData" на основании приказа заголовка информация
Не могли бы вы сказать мне, что такое запрос, который должен идти внутри "writeHeadData" и что такое запрос, который должен идти внутри "writeDetailData", учитывая общий ключ/поле между 2 таблицами
Вот в чем заключается моя трудность.