2014-10-10 6 views
2

У меня есть необычный вопрос, который кажется простым, но у меня есть тупик в хранимой процедуре SQL Server.SQL Server Multiple Likes

У меня есть 2 стола, как описано ниже.

tblMaster

ID, CommitDate, SubUser, OrigFileName 

Выборочные данные

ID CommitDate SubUser OrigFileName 
---------------------------------------- 
1 2014-10-07 Test1  Test1.pdf 
2 2014-10-08 Test2  Test2.pdf 
3 2014-10-09 Test3  Test3.pdf 

В приведенной выше таблице в основном заголовок таблицы, который отслеживает совершенные файлы. В дополнение к этому у нас есть таблица подробностей со следующей структурой.

tblIndex

ID, FileID (Linking column to the header row described above), Word 

Образец данных:

1. 1, 1, Oil 
2. 2, 1, oil 
3. 3, 2, oil 
4. 4, 2, tank 
5. 5, 3, tank 

Указанные строки представляют собой слова, которые мы хотим искать, и если определенные критерии совпадения возвращает соответствующее имя файла/строка заголовка ID , То, что я хотел бы понять, чтобы сделать это, если я делаю поиск

  1. Одним словом (например, «масло»), то система должна реагировать со всеми файлами, которые удовлетворяют критерии (простой случай, и выяснил,)
  2. Если поиск производится более чем одним словом (например, «масло» и «резервуар»), тогда мы должны видеть только второй файл, так как он является единственным, у которого в качестве ключевых слов есть масло и резервуар.
    • Пробовал использовать LIKE «% oil%» и «% tank%», и это не приводило к тому, что никакие строки не создавались, поскольку одно значение не может быть как маслом, так и резервуаром.
    • Пробовал делать «% масла%» или «% tank%», но я получаю файлы 1, 2 и 3, так как OR содержит все остальные строки.
    • Наконец-то я узнал, что могу просто выполнить поиск по первому члену, а затем сохранить результаты в таблице temp и затем найти второй термин в этой второй таблице, и я получу то, что ищу. Проблема в том, что я точно не знаю, сколько предметов будет искать. Я не хочу создавать структуру, где мне постоянно приходится хранить данные в другую временную таблицу, если кто-то выполняет поиск по 6 «ключевым словам».

Любая помощь/идеи будут оценены.

ответ

0

попробуйте это!немного отличается от предыдущего ответа

SELECT distinct FileID,COUNT(distinct t.word) FROM tblIndex t 
WHERE t.Word LIKE '%oil%' OR t.Word LIKE '%tank%' 
GROUP BY FileID 
HAVING COUNT(distinct t.word) > 1 
+0

это отлично работало. Я хотел бы задать другой вопрос, если это возможно. Если у меня есть более 2 слов для поиска «большого масляного бака», увеличивается ли значение HAVING COUNT до> 2? –

+0

Да, да. Это число различных слов, которые нужно сопоставить, в вашем примере более 2, следовательно> 2. – Ndech

+0

Большое спасибо. –

0

Один простой вариант должен был бы сделать что-то вроде этого:

SELECT FileID 
FROM tblIndex t 
WHERE t.Word LIKE '%oil%' OR t.Word LIKE '%tank%' 
GROUP BY FileID 
HAVING COUNT(*) > 1 

Это предполагаем, что вы не имеете дубликат в вашем tblIndex.

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

+0

К сожалению, у меня есть дублированные строки в индексе. Причина в том, что этот индекс представляет все экземпляры определенного слова в файле. Поэтому я не знаю, сколько раз слово «нефть» появится в файле. Кроме того, вы правы, что LIKE не требуется, если я хочу точное совпадение. Я просто хотел включить то, что я пробовал. –

Смежные вопросы