Re[3]: Как корректно извлечь данные?
От: . Великобритания  
Дата: 14.02.10 16:34
Оценка: 2 (1) +1
On 14/02/2010 16:23, atlant83 wrote:
> Эта логика осуществляется посредством конструкции switch в коде приложения
в общем, по-моему это криво. Либо так:
select SAMPLELIST.SAMPLE_NAMEID, ..., coalesce(NAME_POISON, WATER, SH, ZERNO) as SAMPLE_NAME
   from SAMPLELIST
     left join POISONSRB on POISONSRB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=0
     left join WATERRB on WATERRB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=1
     left join SHRB on SHRB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=2
     left join ZERNORB on ZERNORB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=3

а лучше таблицы POISONSRB, WATERRB, SHRB, ZERNORB объединить в одну, добавив туда колонку sample_type и тогда вообще всё элементарно.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Как корректно извлечь данные?
От: любой  
Дата: 14.02.10 14:41
Оценка: 2 (1)
Здравствуйте, ., Вы писали:

...

Лучше UNION'ом склеить 4 запроса
художников никогда не обижал
Re[4]: Как корректно извлечь данные?
От: Caracrist https://1pwd.org/
Дата: 14.02.10 16:47
Оценка: 2 (1)
Здравствуйте, ., Вы писали:

.>On 14/02/2010 16:23, atlant83 wrote:

>> Эта логика осуществляется посредством конструкции switch в коде приложения
.>в общем, по-моему это криво. Либо так:
.>
.>select SAMPLELIST.SAMPLE_NAMEID, ..., coalesce(NAME_POISON, WATER, SH, ZERNO) as SAMPLE_NAME
.>   from SAMPLELIST
.>     left join POISONSRB on POISONSRB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=0
.>     left join WATERRB on WATERRB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=1
.>     left join SHRB on SHRB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=2
.>     left join ZERNORB on ZERNORB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=3
.>

.>а лучше таблицы POISONSRB, WATERRB, SHRB, ZERNORB объединить в одну, добавив туда колонку sample_type и тогда вообще всё элементарно.


select SAMPLELIST.SAMPLE_NAMEID, ..., coalesce(NAME_POISON, WATER, SH, ZERNO) as SAMPLE_NAME
   from SAMPLELIST
     left join POISONSRB on POISONSRB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=0
     left join WATERRB on WATERRB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=1
     left join SHRB on SHRB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=2
     left join ZERNORB on ZERNORB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=3
   where not coalesce(NAME_POISON, WATER, SH, ZERNO) is null -- same as inner join

~~~~~
~lol~~
~~~ Single Password Solution
Как корректно извлечь данные?
От: atlant83  
Дата: 14.02.10 11:52
Оценка:
Здравствуйте.
Разрабатываю приложение в среде VS, язык С#, встраиваемая база данных Firebird Embedded.
Необходимо извлечь данные из таблицы БД. Структура БД подразумевает, что для поля SAMPLE_NAMEID (идентификатор наименования образца) таблицы SAMPLELIST существуют 4 справочника для извлечения наименования образца. Выбор справочника зависит от значения поля SAMPLELIST.SAMPLE_TYPE. Обычно при извлечении данных таблицы SAMPLELIST значение поля SAMPLE_TYPE известно и формирование запроса происходит динамически. Т.е. в зависимости от значения SAMPLE_TYPE инициализируются строковые переменные
switch (SAMPLE_TYPE)
{
    case 0:
        SampleNameIdJoin = . . .
        SampleNameIdTable = . . .
        break;
. . .
}

которые затем вставляются в основной текст запроса (SelectCommand.CommandText).
Но, в некоторых случаях возникает ситуация когда значение поля SAMPLELIST.SAMPLE_TYPE заранее неизвестно, но есть значение поля SAMPLELIST. CONTRACTID согласно которому необходимо извлечь записи из таблицы SAMPLELIST. Каким образом можно осуществить эту операцию наиболее корректно (учитывая скорость выполнения этой операции ). Возникли такие вопросы:
1) Обязательно ли в этом случае использовать цикл в котором, по ранее извлеченным значениям SAMPLELIST.SAMPLE_TYPE (например, запрос вернул массив из трех значений SAMPLE_TYPE для SAMPLELIST. CONTRACTID = 2) формируем динамически текст запроса, аналогично следующему варианту
for (для всех извлеченных значений SAMPLE_TYPE)
{
//1 - Инициализируем переменные в зависимости от конкретного SAMPLE_TYPE
switch (SAMPLE_TYPE)
{
    case 0:
        SampleNameIdJoin = . . .
        SampleNameIdTable = . . .
        break;
. . .
}
//2 - Создаем текст запроса (SelectCommand.CommandText) используя проинициализированные выше переменные.
//3 - Выводим полученные данные в DataGridView
}

2) Возможно ли в одном тексте запроса сконструировать подобную логику извлечения данных или, возможно, есть более простой вариант извлечения данных чем описанный в вопросе №1?
3) Где лучше прописать эту логику извлечения данных — в хранимой процедуре (вызываемой затем из приложения) или в отдельной функции приложения?
Спасибо всем ответившим.
Re: Как корректно извлечь данные?
От: . Великобритания  
Дата: 14.02.10 12:08
Оценка:
On 14/02/2010 13:52, atlant83 wrote:
> Возможно ли в одном тексте запроса сконструировать подобную логику
> извлечения данных или, возможно, есть более простой вариант извлечения
> данных чем описанный в вопросе №1?
Можно что-то вроде такого:
select sample_nameid, sample_type, dict1.value,dict2.value, dict3.value, dict4.value
   from samplelist
    left join dict1.id=sample_nameid and sample_type='type1'
    left join dict2.id=sample_nameid and sample_type='type2'
    left join dict3.id=sample_nameid and sample_type='type3'
    left join dict4.id=sample_nameid and sample_type='type4'

Хотя, наверное проще и эффективнее положить все 4 справочника в одну таблицу.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Как корректно извлечь данные?
От: Caracrist https://1pwd.org/
Дата: 14.02.10 12:55
Оценка:
Здравствуйте, atlant83, Вы писали:

A>Спасибо всем ответившим.


Missing information:
Где хранятся данные о логике:
SAMPLE_TYPE -> SAMPLE_NAMEID source table
В базе данных в таблице или в памяти приложения?

И непонятно(мне) описаны схемы таблиц:
SAMPLELIST:
SAMPLE_TYPE , SAMPLE_NAMEID, CONTRACTID
и всё? тогда я не понял что требуется.

П.С. прошу прощения если не понимаю очевидного
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: Как корректно извлечь данные?
От: atlant83  
Дата: 14.02.10 14:23
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, atlant83, Вы писали:


A>>Спасибо всем ответившим.


C>Missing information:

C>Где хранятся данные о логике:
C>SAMPLE_TYPE -> SAMPLE_NAMEID source table
C>В базе данных в таблице или в памяти приложения?

Эта логика осуществляется посредством конструкции switch в коде приложения

switch (SAMPLE_TYPE)
{
 case 0:
 SampleNameIdJoin = @"JOIN ""POISONSRB"" ON ""POISONSRB"".""RECID"" = ""SAMPLELIST"".""SAMPLE_NAMEID""";
 SampleNameIdTable = @" ""POISONSRB"".""NAME_POISON"" AS ""SAMPLE_NAME"", ";
 break;
 case 1:
 SampleNameIdJoin = @"JOIN ""WATERRB"" ON ""WATERRB"".""RECID"" = ""SAMPLELIST"".""SAMPLE_NAMEID""";
 SampleNameIdTable = @" ""WATERRB"".""WATER"" AS ""SAMPLE_NAME"", ";
 break;
 case 2:
 SampleNameIdJoin = @"JOIN ""SHRB"" ON ""SHRB"".""RECID"" = ""SAMPLELIST"".""SAMPLE_NAMEID""";
 SampleNameIdTable = @" ""SHRB"".""SH"" AS ""SAMPLE_NAME"", ";
 break;
 case 3:
 SampleNameIdJoin = @"JOIN ""ZERNORB"" ON ""ZERNORB"".""RECID"" = ""SAMPLELIST"".""SAMPLE_NAMEID""";
 SampleNameIdTable = @" ""ZERNORB"".""ZERNO"" AS ""SAMPLE_NAME"", ";
 break;
}

Далее проинициализированные переменные вставляются в текст запроса:

SelectCommand.CommandText = @"SELECT ""SAMPLELIST"".""RECID"", ""SAMPLELIST"".""SAMPLE_NAMEID""," + SampleNameIdTable + @"""SAMPLELIST"".""SAMPLE_NUMBER"", ""SAMPLELIST"".""SAMPLE_TYPE"", ""SAMPLELIST"".""ACQUISITION_DATE"", 
""SAMPLELIST"".""PERIODID"", ""PERIODRB"".""PERIOD"", ""SAMPLELIST"".""CLIENTID"", ""CLIENTSRB"".""NAME_COMPANY"", ""SAMPLELIST"".""PERCENTAGE_LOSS_DV"", ""SAMPLELIST"".""IS_ALLOWED"", ""SAMPLELIST"".""AREA"", ""SAMPLELIST"".""TONNAGE"", 
""SAMPLELIST"".""YIELD"", ""SAMPLELIST"".""INFORMATION"", ""SAMPLELIST"".""EMPLOYEEID"", ""EMPLOYEERB"".""LAST_NAME"", ""SAMPLELIST"".""COMMENTS"", ""SAMPLELIST"".""AIM"", ""SAMPLELIST"".""ANALYSIS_DATE"",
""SAMPLELIST"".""FITID"", ""FITRB"".""FIT"", ""SAMPLELIST"".""QUANTITY"", ""SAMPLELIST"".""QUANTITY_MEASUREID"", ""MEASURERB"".""MEASURE"", ""SAMPLELIST"".""LOT_NUMBER"", ""SAMPLELIST"".""OUTPUT_YEAR"", ""SAMPLELIST"".""KEEPING_TERMID"",
""KEEPINGTERMRB"".""KEEPING_TERM"", ""SAMPLELIST"".""IS_PAYMENT"", ""SAMPLELIST"".""PRICE"", ""SAMPLELIST"".""CONTRACTID"", ""CONTRACTLIST"".""CONTRACT_NUMBER"", ""SAMPLELIST"".""SPRAY_DATE"", ""SAMPLELIST"".""ANALYSIS_QUANTITY""
FROM ""SAMPLELIST"" 
INNER " + SampleNameIdJoin + @" 
JOIN ""PERIODRB"" ON ""PERIODRB"".""RECID"" = ""SAMPLELIST"".""PERIODID""
JOIN ""CLIENTSRB"" ON ""CLIENTSRB"".""RECID"" = ""SAMPLELIST"".""CLIENTID"" 
JOIN ""EMPLOYEERB"" ON ""EMPLOYEERB"".""RECID"" = ""SAMPLELIST"".""EMPLOYEEID""
JOIN ""FITRB"" ON ""FITRB"".""RECID"" = ""SAMPLELIST"".""FITID""
JOIN ""MEASURERB"" ON ""MEASURERB"".""RECID"" = ""SAMPLELIST"".""QUANTITY_MEASUREID""
JOIN ""KEEPINGTERMRB"" ON ""KEEPINGTERMRB"".""RECID"" = ""SAMPLELIST"".""KEEPING_TERMID""                                                    
JOIN ""CONTRACTLIST"" ON ""CONTRACTLIST"".""RECID"" = ""SAMPLELIST"".""CONTRACTID""
WHERE ""SAMPLELIST"".""SAMPLE_TYPE"" = ? AND ""SAMPLELIST"".""PERIODID"" = ?";

C>И непонятно(мне) описаны схемы таблиц:
C>SAMPLELIST:
C>SAMPLE_TYPE , SAMPLE_NAMEID, CONTRACTID
C>и всё?

Полный перечень полей таблицы SAMPLELIST содержится в запросе, который представлен выше.
Re[3]: Как корректно извлечь данные?
От: Caracrist https://1pwd.org/
Дата: 14.02.10 14:56
Оценка:
Здравствуйте, atlant83, Вы писали:

A>Здравствуйте, Caracrist, Вы писали:


C>>Здравствуйте, atlant83, Вы писали:


A>>>Спасибо всем ответившим.


C>>Missing information:

C>>Где хранятся данные о логике:
C>>SAMPLE_TYPE -> SAMPLE_NAMEID source table
C>>В базе данных в таблице или в памяти приложения?

A>Эта логика осуществляется посредством конструкции switch в коде приложения


Ясно, но тогда смущает следующее:

Но, в некоторых случаях возникает ситуация когда значение поля SAMPLELIST.SAMPLE_TYPE заранее неизвестно, но есть значение поля SAMPLELIST. CONTRACTID согласно которому необходимо извлечь записи из таблицы SAMPLELIST.

А где находится логика "согласно которой" извлекаются данные, и какое это отношение имеет к SAMPLE_TYPE?
Что значит "заранее неизвестно"? Почему нельзя сделать запрос когда будет известно? Речь случайно не о разновидности подзапроса?


A>Полный перечень полей таблицы SAMPLELIST содержится в запросе, который представлен выше.

Спасибо, так понятно.
~~~~~
~lol~~
~~~ Single Password Solution
Re[4]: Как корректно извлечь данные?
От: atlant83  
Дата: 14.02.10 19:06
Оценка:
Здравствуйте, ., Вы писали:

.>On 14/02/2010 16:23, atlant83 wrote:

>> Эта логика осуществляется посредством конструкции switch в коде приложения
.>в общем, по-моему это криво. Либо так:
.>
.>select SAMPLELIST.SAMPLE_NAMEID, ..., coalesce(NAME_POISON, WATER, SH, ZERNO) as SAMPLE_NAME
.>   from SAMPLELIST
.>     left join POISONSRB on POISONSRB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=0
.>     left join WATERRB on WATERRB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=1
.>     left join SHRB on SHRB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=2
.>     left join ZERNORB on ZERNORB.RECID=SAMPLELIST.SAMPLE_NAMEID and SAMPLE_TYPE=3
.>


спасибо.

.>а лучше таблицы POISONSRB, WATERRB, SHRB, ZERNORB объединить в одну, добавив туда колонку sample_type и тогда вообще всё элементарно.


В одну нельзя объединять, т.к. они не соответствуют друг другу структурно.
Re[5]: Как корректно извлечь данные?
От: . Великобритания  
Дата: 14.02.10 19:17
Оценка:
On 14/02/2010 21:06, atlant83 wrote:

> В одну нельзя объединять, т.к. они не соответствуют друг другу структурно.

В общем да, раз так. Но если станет тормозить, то возможно придётся объединить.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.