2015-03-04 3 views
2
SELECT * 
FROM (
     SELECT TOP 100 
     o.[Incident ID], 
     o.[Affected CI], 
     o.Title, 
     o.[Description], 
     d.[DB NAME], 
     ROW_NUMBER() OVER(PARTITION BY o.[Incident ID] ORDER BY o.[Incident ID]) rn 
     FROM Oracle_Incident_Data.dbo.Oracle_Incidents AS O 
     LEFT JOIN Oracle_Incident_Data.dbo.DB_NAMES_ORA$ AS D 
     ON CONCAT(COALESCE(o.[Affected CI],' '), COALESCE(o.[Title],' '), COALESCE(o.[Description],' ')) LIKE '%' + d.[DB NAME] + '%' 
    ) a 
WHERE rn = 1 

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

+3

Ваш синтаксис предлагает другой db, чем mysql, возможно, сервер sql – Mihai

+0

это сервер sqr, извините, плохой тег. – Travis

ответ

3

Функции окна сначала сбивают с толку. Без сомнений.

ROW_NUMBER() OVER(PARTITION BY o.[Incident ID] ORDER BY o.[Incident ID]) rn 

Эта линия будет создавать row_number, начиная с 1 и восходящей для каждой записи. Он начнется с 1 для каждого нового o.[Incident ID], который встречается в результирующем наборе запроса. Он также определяет порядок нумерации на o.[Incident ID].

Например:

rn IncidentID 
1  A 
2  A 
3  A 
1  B 
2  B 
1  C 
2  C 
3  C 

Чтобы посмотреть, что он делает принять подзапрос, и запустить его сам по себе, сортировки результатов запроса по o.[Incident ID]. Тогда это станет ясно.

Ваш основной запрос с WHERE rn = 1 затем отфильтровывает только записи, в которых ROW_NUMBER является 1.

Все, что было сказано, я не думаю, что это правильно, как написано. PARTITION BY и ORDER BY действительно не должны быть одинаковыми. Это приведет к произвольной нумерации, когда у вас есть несколько записей в вашем наборе записей с тем же o.[Incident ID]. И эти результаты могут меняться каждый раз, когда вы запускаете запрос в зависимости от того, как ваша база данных извлекает данные из базовых таблиц.

Вместо этого вы должны, вероятно, ORDER BY что-то, что на самом деле даст ЗАКАЗ, когда вы перейдете на o.[Incident ID]. Обычно это поле DATE или some measure, но оно может быть чем-то вроде вашего Title или Description.

+0

Очень хорошее и простое объяснение ROW_NUMBER() OVER (...) Помогает тем особенно, когда у них есть контекст со своими собственными данными, а не только ... вот ответ и не понимающий контекст. – DRapp