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

Откуда:
Сообщений: 125
Существуют 2 таблицы Incidents и Relation.
В запросе использую INNER JOIN
Но встречаются такие случаи,когда в таблице Relation,встречаются 2 результата на одно значение из таблицы Incidents(как на рисунке), а в выводе нужно вытащить первый.
Как это сделать?


  SELECT ASSIGNEE
  FROM Incidents I 
  INNER JOIN Relation S ON S.SOURCE = I.INCIDENT_ID
  WHERE I.OPEN_TIME >=  (@StartDate) and I.OPEN_TIME < (@EndDate + 1)
 and (S.TYPE = 'Escalation' or S.TYPE = 'Fulfillment')
and I.FOLDER = 'EGK'


К сообщению приложен файл. Размер - 2Kb
7 авг 17, 09:51    [20704423]     Ответить | Цитировать Сообщить модератору
 Re: одинаковые значения в join  [new]
Marin_1a
Member

Откуда:
Сообщений: 125
Суммировать результат не нужно, а только вынести одно из 2х значений
7 авг 17, 09:52    [20704430]     Ответить | Цитировать Сообщить модератору
 Re: одинаковые значения в join  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
В SQL нет первых и последних. Если надо вытащить минимальный, то надо:

SELECT i.Incidents, MIN(s.Relation)
.....
GROUP BY i.Incidents
7 авг 17, 10:08    [20704479]     Ответить | Цитировать Сообщить модератору
 Re: одинаковые значения в join  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20538
Marin_1a
в выводе нужно вытащить первый
Не существует такого понятия как "первый" просто так. Оно существует только в том случае, когда задана сортировка, причём такая, что ключ сортировки уникален для любой группы. Т.е. в случае показанного скрина с данными это может быть, например, сортировка по возрастанию Relation, обеспечивающая уникальность в группе по Incidents.

Для решения задачи придётся вводить группировку и брать, например, MIN() по полю, имеющему множественные значения. Как именно это реализовывать - использовать группировку с отбором в полном запросе, использовать группирующий подзапрос вместо таблицы, использовать дополнительный подзапрос в секции отбора - решайте сами.
7 авг 17, 10:16    [20704495]     Ответить | Цитировать Сообщить модератору
 Re: одинаковые значения в join  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
Если ASSIGNEE относится к Relation:
SELECT S.ASSIGNEE
  FROM Incidents I 
  cross apply (select top (1) ASSIGNEE from Relation where SOURCE = I.INCIDENT_ID and TYPE = 'Escalation' or TYPE = 'Fulfillment') S
WHERE I.OPEN_TIME >=  (@StartDate) and I.OPEN_TIME < (@EndDate + 1) and I.FOLDER = 'EGK'
Если нет:
SELECT ASSIGNEE
  FROM Incidents I 
WHERE I.OPEN_TIME >=  (@StartDate) and I.OPEN_TIME < (@EndDate + 1)
 and exists(select * from Relation where (SOURCE = I.INCIDENT_ID and TYPE = 'Escalation' or TYPE = 'Fulfillment')
 and I.FOLDER = 'EGK'
7 авг 17, 12:36    [20704988]     Ответить | Цитировать Сообщить модератору
 Re: одинаковые значения в join  [new]
Marin_1a
Member

Откуда:
Сообщений: 125
invm
Если ASSIGNEE относится к Relation:
SELECT S.ASSIGNEE
  FROM Incidents I 
  cross apply (select top (1) ASSIGNEE from Relation where SOURCE = I.INCIDENT_ID and TYPE = 'Escalation' or TYPE = 'Fulfillment') S
WHERE I.OPEN_TIME >=  (@StartDate) and I.OPEN_TIME < (@EndDate + 1) and I.FOLDER = 'EGK'
Если нет:
SELECT ASSIGNEE
  FROM Incidents I 
WHERE I.OPEN_TIME >=  (@StartDate) and I.OPEN_TIME < (@EndDate + 1)
 and exists(select * from Relation where (SOURCE = I.INCIDENT_ID and TYPE = 'Escalation' or TYPE = 'Fulfillment')
 and I.FOLDER = 'EGK'


Огромное спасибо! Получилось =)
7 авг 17, 13:42    [20705276]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить