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

Откуда:
Сообщений: 52
Как правильно написать в этом запросе, чтобы выбирался минимальное значение из таблицы 2.
select * from Table1 where ServiceID in (Select rf_ServiceID from Table2 where Value1=min(Value1))
22 ноя 18, 15:48    [21741544]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
court
Member

Откуда:
Сообщений: 1985
... in (Select top 1 rf_ServiceID from Table2 order by Value1)
22 ноя 18, 15:54    [21741560]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
court
... in (Select top 1 rf_ServiceID from Table2 order by Value1)

а 2 rf_ServiceID не могут иметь одинаковое min(Value1) ?
22 ноя 18, 15:55    [21741564]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
El_Ninio
Member

Откуда:
Сообщений: 52
court, ничего не возвращает(
22 ноя 18, 16:03    [21741584]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
El_Ninio
Member

Откуда:
Сообщений: 52
court, тут я забыл еще одно условие написать
вот так должно быть
select * from Table1 where ServiceID in (Select rf_ServiceID from Table2 where Value1=min(Value1)) and DocID=11
22 ноя 18, 16:07    [21741590]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
court
Member

Откуда:
Сообщений: 1985
El_Ninio
court, ничего не возвращает(
бывает ...
22 ноя 18, 16:11    [21741600]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
El_Ninio
Member

Откуда:
Сообщений: 52
Вообщем, в таблице 1 в документе с айди 11 serviceid разные, например 100, 155, 138, 120 и так далее, это ну скажем, выполненные услуги, а их цена во второй таблице, где переменная Value1. Мне надо минимальную сумму выбрать из этих выполненных услуг.
22 ноя 18, 16:13    [21741611]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4681
El_Ninio
Вообщем, в таблице 1 в документе с айди 11 serviceid разные, например 100, 155, 138, 120 и так далее, это ну скажем, выполненные услуги, а их цена во второй таблице, где переменная Value1. Мне надо минимальную сумму выбрать из этих выполненных услуг.


Тестовый набор данных закиньте сюда, чтобы вам могли что-то сказать вразумительное.

Скорее всего вам OUTER APPLY нужен или оконная функция
22 ноя 18, 16:25    [21741633]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
El_Ninio
Member

Откуда:
Сообщений: 52
Таблиц прикрепил

К сообщению приложен файл. Размер - 53Kb
22 ноя 18, 16:51    [21741675]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
El_Ninio
Member

Откуда:
Сообщений: 52
Люди, помогитееее. Как мне выбрать мин значение из Value1
22 ноя 18, 18:32    [21741867]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
PizzaPizza
Member

Откуда:
Сообщений: 349
El_Ninio,

чем вам не нравится вариант
court
... in (Select top 1 rf_ServiceID from Table2 order by Value1)
?

выполните подзапрос отдельно и посмотрите получаете ли вы минимальную цену
22 ноя 18, 20:56    [21742092]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1346
PizzaPizza
El_Ninio,

чем вам не нравится вариант
court
... in (Select top 1 rf_ServiceID from Table2 order by Value1)
?

выполните подзапрос отдельно и посмотрите получаете ли вы минимальную цену


следует учитывать что распределение данных в таблице 2 у ТС может быть к примеру такое:

ServiceID Value1
501 1
502 2
503 1
504 10

тогда запрос лучше нарисовать так:
select *
from [Table1] t1
where exists (select 1 from [Table2] t2 where t2.[rf_ServiceID] = t1.[ServiceID] and t2.[Value1] = (select min(t3.[Value1]) from [Table2]))


или так
select * from [Table1] t1
where t1.[ServiceID] in (select top 1 with ties [rf_ServiceID] from [Table2] order by [Value1] ASC)
22 ноя 18, 22:50    [21742182]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1346
чорд:
select *
from [Table1] t1
where exists (select 1 from [Table2] t2 where t2.[rf_ServiceID] = t1.[ServiceID] and t2.[Value1] = (select min(t3.[Value1]) from [Table2] t3))
22 ноя 18, 22:51    [21742183]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
londinium
Member

Откуда: Киев
Сообщений: 1165
USE MASTER 
GO

WITH CTE AS
(
  SELECT 507473 AS DOCID,7090 AS SERVICEID
   UNION ALL
  SELECT 507473 AS DOCID,7357 AS SERVICEID
   UNION ALL
  SELECT 507473 AS DOCID,7430 AS SERVICEID
   UNION ALL
  SELECT 507473 AS DOCID, 7430 AS SERVICEID
   UNION ALL
  SELECT 507473 AS DOCID,7430 AS SERVICEID
   UNION ALL
  SELECT 507473 AS DOCID,7430 AS SERVICEID
   UNION ALL
  SELECT 507473 AS DOCID,7476 AS SERVICEID
   UNION ALL
  SELECT 507473 AS DOCID,7476 AS SERVICEID
   UNION ALL
  SELECT 507473 AS DOCID,7476 AS SERVICEID
   UNION ALL
  SELECT 507473 AS DOCID,7289 AS SERVICEID         
),
SERV AS
(
  SELECT 7090 AS SERVICE_ID,1.18 AS VALUE1
   UNION ALL
  SELECT 7289 AS SERVICE_ID,0.5 AS VALUE1
   UNION ALL
  SELECT 7357 AS SERVICE_ID,0.25 AS VALUE1
   UNION ALL
  SELECT 7430 AS SERVICE_ID,0.46 AS VALUE1
   UNION ALL
  SELECT 7432 AS SERVICE_ID,1.25 AS VALUE1
   UNION ALL
  SELECT 7476 AS SERVICE_ID,0.92 AS VALUE1     
)
/*
Вообщем, в таблице 1 в документе с айди 11 serviceid разные, например 100, 155, 138, 120 
и так далее, это ну скажем, выполненные услуги, а их цена во второй таблице, где переменная Value1. 
Мне надо минимальную сумму выбрать из этих выполненных услуг.
*/
SELECT C.DOCID,C.SERVICEID,X.VALUE1
FROM CTE C
CROSS APPLY
(
  SELECT TOP 1 S.SERVICE_ID,S.VALUE1
   FROM SERV S
  ORDER BY S.VALUE1 
)X
22 ноя 18, 23:03    [21742190]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
El_Ninio
Member

Откуда:
Сообщений: 52
Я неправильно объяснил, результирующая выборка должна быть из первой таблицы. Должна выбираться из первой таблицы только та запись где SERVICEID равно во второй таблице с минимальной суммой. Из скриншота первой таблицы должна остаться запись где SERVICEID=7357 потому что она во второй таблице с минимальной суммой.
23 ноя 18, 05:45    [21742279]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
PizzaPizza
Member

Откуда:
Сообщений: 349
El_Ninio
Я неправильно объяснил, результирующая выборка должна быть из первой таблицы. Должна выбираться из первой таблицы только та запись где SERVICEID равно во второй таблице с минимальной суммой. Из скриншота первой таблицы должна остаться запись где SERVICEID=7357 потому что она во второй таблице с минимальной суммой.


OMG... Так вы и начните по порядку. 1. Получите SERVICEID для начала из второй таблицы. 2. Используйте полученный SERVICEID для выборки из первой таблицы.
Вы получаете SERVICEID отдельно или нет? Если вы его получаете, но он не тот, который вы хотите, тогда думайте ещё раз про вашу минимальную сумму.
Запрос courtа из приведенных вами данных выдаст именно 7357.
23 ноя 18, 05:55    [21742283]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
El_Ninio
Member

Откуда:
Сообщений: 52
PizzaPizza, при выполнении запроса court ничего не выбирается.
select * from Table1 where DocID=507473 and SERVICEID in (Select TOP 1 rf_ServiceID from oms_Tariff order by Value1)
тут еще по конкретному документу же ищется, документ с номером 507473.
23 ноя 18, 06:30    [21742288]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
PizzaPizza
Member

Откуда:
Сообщений: 349
El_Ninio,

если у вас подзапрос
Select TOP 1 rf_ServiceID from oms_Tariff order by Value1

не выдает ничего, то вы и не получите ничего внятного
разбирайтесь сначала с подзапросом, почему вы не получаете нужный ID
23 ноя 18, 07:18    [21742300]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
El_Ninio
Member

Откуда:
Сообщений: 52
PizzaPizza, если выполнить вот так:
select * from Table1 where ServiceID= (Select top 1 rf_ServiceID from Table2 where rf_ServiceID in (select ServiceID from Table1 where DOCID=507473) order by Value1) and DocID=507473
то получаю что мне нужно, по конкретному документу DOCID=507473. А если документов много, хочу по каждому документу найти мин значение то как сделать?
23 ноя 18, 07:46    [21742307]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
PizzaPizza
Member

Откуда:
Сообщений: 349
El_Ninio
PizzaPizza, если выполнить вот так:
select * from Table1 
where ServiceID= 
(Select top 1 rf_ServiceID from Table2 w
here rf_ServiceID in 
(select ServiceID from Table1 where DOCID=507473) order by Value1) and DocID=507473


то получаю что мне нужно, по конкретному документу DOCID=507473.


Вы выбираете из Table1 ServiceID для всех строк с DOCID=507473, потом выбираете по сути тот же ServiceID для одной строки из Table2 с минимальным Value1, и в конце выбираете из Table1 строки с DOCID=507473 и полученным ранее для него же ServiceID.
Какой смысл тут во второй таблице, если вы по сути выбираете из Table1 строки с DOCID=507473? Никак минимальность значения не используется в запросе. Единственное, что вы получаете проверку, что у вас во второй таблице есть запись с ServiceID для DOCID=507473

select * from Table1 
where DocID=507473

Этот запрос даст тот же результат, что и ваш.

El_Ninio
А если документов много, хочу по каждому документу найти мин значение то как сделать?


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

Попробуйте сформулировать задачу ещё раз. Что вам надо выбрать и с каким условием.
23 ноя 18, 09:17    [21742352]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
select t1.*
  from Table1 t1
 Outer apply (Select top 1 rf_ServiceID 
                from Table2 
               where rf_ServiceID in (select ServiceID from Table1 where DOCID=t1.DOCID) order by Value1) t2
 where ServiceID = rf_ServiceID
23 ноя 18, 09:43    [21742392]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать минимальное значение во вложенных запросах  [new]
El_Ninio
Member

Откуда:
Сообщений: 52
Kopelly,спасибо большое!
23 ноя 18, 15:31    [21742990]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить