2016-11-11 1 views
1

Как найти записи, которая соответствует определенным последовательностям из приведенных ниже таблиц:Запрос, чтобы найти записи, следуя той же последовательности шаблонов?

ID s_id task 
1 1  a 
1 2  b 
1 3  b 
1 4  c 
1 5  c 
1 6  d 
1 7  a 
2 1  a 
2 2  c 
2 3  c 
3 1  a 
3 2  b 
3 3  c 
3 4  d 
1 1  a 
1 2  b 
1 3  c 
1 4  c 
1 5  e 
1 6  d 

Как выборки записи следующей ниже шаблона

  1. 1 или более б
  2. с
+1

Это похоже на тестовый вопрос? Вы даже попытались создать собственный SQL? – Edper

+1

Больше похоже на домашнее задание. –

+0

Да, я попытался .. Но не смог продолжить, не зная, как соответствовать определенной последовательности записей. – Vicky

ответ

2

Ниже код преобразует ваши данные в список посещений сайта (id), за которым следует одна строка символов, представляющих посещенные страницы (например, "Abbbcd").

 SELECT t2.id, max(tasks) as tasks from 
     (
      SELECT t1.id, 
      (SELECT '' + Task FROM [Table] WHERE id = t1.id ORDER BY s_Id FOR XML PATH('')) AS tasks 
      from [Table] t1 
     ) t2 
     group by t2.id 

Так что проблема теперь сводится к поиску шаблона символов: а - любое число b's - с. Вы можете использовать LIKE для этого:

SELECT * 
FROM (
     SELECT t2.id, max(tasks) as tasks from 
     (
      SELECT t1.id, 
      (SELECT '' + Task FROM [Table] WHERE id = t1.id ORDER BY s_Id FOR XML PATH('')) AS tasks 
      from [Table] t1 
     ) t2 
     group by t2.id 
    ) t3 
WHERE t3.tasks LIKE '%abc%' 
OR t3.tasks LIKE '%abbc%' 
    OR t3.tasks LIKE '%abbbc%' 
    OR t3.tasks LIKE '%abbbbc%'; 

Это немного грубо. Вы хотите сказать любое количество букв, но LIKE не поддерживает это. Для этого обычно используются регулярные выражения (RegEx). Выражение будет «ab + c», которое означает: «a», за которым следует 1 или более «b», а затем «c».

К сожалению, SQL-сервер не поддерживает регулярное выражение (Oracle), поэтому для его реализации необходимо использовать CLR. Другие сделали это за вас, поэтому вы можете следовать инструкциям здесь, чтобы установить его: https://www.simple-talk.com/sql/t-sql-programming/clr-assembly-regex-functions-for-sql-server-by-example/

+0

Должно ли быть какие-то «ORDER BY» вокруг части «FOR XML» для построения строки в определенном порядке? –

+0

@VladimirBaranov хорошо замечен, ему нужен пункт ORDER BY. Исправлено в ответе. – under