Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с запросом...  [new]
MiGan
Member

Откуда:
Сообщений: 49
Помогите пожалуйста с написанием запроса:
Есть таблица TABLE1:

ID, int (4)
FIELD1, int (4)
FIELD2, int (4)
FIELD3, int (4)

Запрос д. выглядить так:

Запрос должен возвращать значение поля ID и наименование поля FIELD.., в качестве аргументов передается значение одного из полей FIELD (WHERE @arg = FIELD1 OR @arg = FIELD2 OR @arg = FIELD3). Можно и так, чтобы вместо наименования поля возвращался какой нибудть определяющий его символ, индекс, например 1,2,3.

Подозреваю, что подстроку возвращаемых полей нужно задавать case но как - не знаю. Очень жду Вашей помощи!!!
12 сен 05, 14:01    [1868892]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Эээ... Что-то трудно представляется, что надо получить. Исходные данные и результат можно увидеть?
12 сен 05, 14:05    [1868914]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом...  [new]
MiGan
Member

Откуда:
Сообщений: 49
Еще раз, я хочу получить имя того столбца, значение которого совпало с аргументом, параметры строки where разделяются оператором or, результат хотелось бы видеть следующим образом:

FieldValue | FieldName

короче, так чтобы знать, значение какого поля совпало со значением аргумента!
12 сен 05, 14:14    [1868958]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом...  [new]
Glory
Member

Откуда:
Сообщений: 104760
MiGan
Еще раз, я хочу получить имя того столбца, значение которого совпало с аргументом, параметры строки where разделяются оператором or, результат хотелось бы видеть следующим образом:

FieldValue | FieldName

короче, так чтобы знать, значение какого поля совпало со значением аргумента!

А если все 3 совпали ?
12 сен 05, 14:15    [1868962]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом...  [new]
Dolphina
Member

Откуда:
Сообщений: 5404
select ID,
case when Field1 = @arg then 1 (или Field1)
when Field2 = @arg then 2 (или Field2)
when Field3 = @arg then 3 (или Field3)
else придумай что-нибудь
end
from Table1
where (Field1 = @arg)
or (Field2 = @arg)
or (Field3 = @arg)

Такое?
Не самый правда красивый вариант.
Но спецы меня поправят.
12 сен 05, 14:16    [1868969]     Ответить | Цитировать Сообщить модератору
 Буду конкретнее...  [new]
MiGan
Member

Откуда:
Сообщений: 49
Понял, что такой пример мало мне поможет, короче, вот мой запрос:

SELECT IP_ADDR, PORT, [ORDER].[ID],  AS REC_ID FROM USER_LOGINS, PERFORMER, [ORDER],
  ORDER_CUSTOM_DATE WHERE 
  (USER_LOGINS.UID = PERFORMER.[USER_ID] OR
  USER_LOGINS.UID = [ORDER].CONTROLLER_ID OR 
  USER_LOGINS.UID = [ORDER].APPOINTER_ID) AND 
  ([ORDER].DATE_END = CAST(CAST(GetDate() as VarChar(17)) as DateTime) OR
  CAST(CAST( 
   CASE INTERVAL_DELTA
     WHEN 'yy' THEN DATEADD(yy, INTERVAL_COEF * PASSED_PERIODS+1, DATE_BEGIN) 
     WHEN 'ww' THEN DATEADD(ww, INTERVAL_COEF * PASSED_PERIODS+1, DATE_BEGIN) 
     WHEN 'dd' THEN DATEADD(dd, INTERVAL_COEF * PASSED_PERIODS+1, DATE_BEGIN)
   END 
   As VarChar(17)) As DateTime) <= CAST(CAST(GETDATE() as VarChar(17)) As DateTime)
     OR CAST(CAST(GETDATE() as VarChar(17)) As DateTime) = ANY (SELECT CAST(CAST([DATE] as VarChar(17)) as DateTime)
     FROM ORDER_CUSTOM_DATE WHERE
     ORDER_CUSTOM_DATE.ORDER_ID = [ORDER].[ID]))

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

Может, результат можно представить так:
IP_ADDR, PORT, ORDER_ID, MATCHED_W_APPOINTER, MATCHED_W_PERFORMER, MATCHED_W_CONTROLLER

Последние три поля пускай возвращают 0 - если совпало значение, 1 - если не совпало...
12 сен 05, 14:27    [1869027]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом...  [new]
MiGan
Member

Откуда:
Сообщений: 49
Пардон, запрос вот так:
SELECT IP_ADDR, PORT, [ORDER].[ID] FROM USER_LOGINS, PERFORMER, [ORDER],
  ORDER_CUSTOM_DATE WHERE 
  (USER_LOGINS.UID = PERFORMER.[USER_ID] OR
  USER_LOGINS.UID = [ORDER].CONTROLLER_ID OR 
  USER_LOGINS.UID = [ORDER].APPOINTER_ID) AND 
  (CAST(CAST([ORDER].[DATE_END] as VarChar(17)) as DateTime) = CAST(CAST(GetDate() as VarChar(17)) as DateTime) OR
  CAST(CAST( 
   CASE INTERVAL_DELTA
     WHEN 'yy' THEN DATEADD(yy, INTERVAL_COEF * PASSED_PERIODS+1, DATE_BEGIN) 
     WHEN 'ww' THEN DATEADD(ww, INTERVAL_COEF * PASSED_PERIODS+1, DATE_BEGIN) 
     WHEN 'dd' THEN DATEADD(dd, INTERVAL_COEF * PASSED_PERIODS+1, DATE_BEGIN)
   END 
   As VarChar(17)) As DateTime) <= CAST(CAST(GETDATE() as VarChar(17)) As DateTime)
     OR CAST(CAST(GETDATE() as VarChar(17)) As DateTime) = ANY (SELECT CAST(CAST([DATE] as VarChar(17)) as DateTime)
     FROM ORDER_CUSTOM_DATE WHERE
     ORDER_CUSTOM_DATE.ORDER_ID = [ORDER].[ID]))  
12 сен 05, 14:31    [1869046]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Мдя... Стало еще "менее понятно". Т.е. "аргументы" плавно трансформировались в условия связывания таблиц, причем в INNER JOIN. Ну так и выведите эти три столбца в виде:

CASE WHEN PERFORMER.[USER_ID] IS NOT NULL THEN 1 END,
CASE WHEN [ORDER].CONTROLLER_ID IS NOT NULL THEN 2 END,
CASE WHEN [ORDER].APPOINTER_ID IS NOT NULL THEN 3 END,
12 сен 05, 14:46    [1869133]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом...  [new]
Taffy
Member

Откуда:
Сообщений: 20501
SELECT IP_ADDR, PORT, [ORDER].[ID] 
FROM USER_LOGINS u left outer join
	PERFORMER p on u.UID = p.[USER_ID] left outer join
	ORDER_CUSTOM_DATE d on ORDER_ID = [ORDER].[ID]
WHERE 
  (CAST(CAST(o1.[DATE_END] as VarChar(17)) as DateTime) = CAST(CAST(GetDate() as VarChar(17)) as DateTime)
or
  CAST(CAST( 
   CASE INTERVAL_DELTA
     WHEN 'yy' THEN DATEADD(yy, INTERVAL_COEF * PASSED_PERIODS+1, DATE_BEGIN) 
     WHEN 'ww' THEN DATEADD(ww, INTERVAL_COEF * PASSED_PERIODS+1, DATE_BEGIN) 
     WHEN 'dd' THEN DATEADD(dd, INTERVAL_COEF * PASSED_PERIODS+1, DATE_BEGIN)
   END 
   As VarChar(17)) As DateTime) <= CAST(CAST(GETDATE() as VarChar(17)) As DateTime)
     OR 
CAST(CAST(GETDATE() as VarChar(17)) As DateTime) = CAST(CAST(d.[DATE] as VarChar(17)) as DateTime 

Хотя это все догадки. Попытайтесь привести структуру таблиц, контрольный пример заполнения, желаемый результат и постановку вопроса.
12 сен 05, 15:03    [1869198]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить