Можно ли искать несколько таблиц с помощью одного запроса? [MSAccess / SQL Server] - PullRequest
0 голосов
/ 22 декабря 2008

Таким образом, моя цель здесь состоит в том, чтобы в приложении было одно поле поиска, которое сможет выполнять поиск по нескольким таблицам и возвращать результаты.

Например, две из этих таблиц - «исполнители» и «места проведения», и есть следующие исполнители: «Джон Эндрюс», «Эндрю Смит», «Джон Доу» и следующие места проведения: «Андреевская церковь» ,"Ратуша". Есть ли способ как-то вернуть первых двух исполнителей и первое место для поиска «Андрея»?

Моей первой мыслью было как-то объединить все таблицы в одну таблицу с тремя столбцами; "SearchableText", "ResultType", "ResultID". В первом столбце будет указано все, что я хочу найти (например, имя исполнителя), во втором будет указано, что отображается (например, исполнитель), а в третьем будет указан идентификатор элемента (примечание: все мои таблицы имеют автоинкрементные первичные ключи для простоты) , Вопрос для этой идеи: возможно ли как-то сделать это динамически или мне нужно добавить код, чтобы иметь таблицу, которая автоматически заполняется при обновлении / добавлении / удалении новой строки из таблицы исполнителей и мест проведения мероприятий (возможно, с помощью триггера?).

Мое приложение написано в MSAccess (я знаю, я знаю, но у меня нет выбора) поверх серверной части SQL Server. Я бы предпочел, чтобы это происходило через MSAccess, поэтому мне не нужно иметь таблицу «searchme» на моем SQL Server, но любой хороший результат приемлем:)

Ответы [ 3 ]

2 голосов
/ 22 декабря 2008

Я думаю, что вы ищете ключевое слово "union" sql

1 голос
/ 22 декабря 2008

Я бы использовал полнотекстовое индексирование на SQL-сервере, имел бы одну таблицу с вашим текстом для поиска и перестановочные ключи в основных таблицах, которые ссылаются на таблицу поиска. Таким образом, вы можете упорядочить результаты по релевантности.

0 голосов
/ 23 декабря 2008

Я думаю, у вас есть проблемы со схемой. Запрос UNION почти всегда свидетельствует об этом (хотя и не во всех случаях).

Вопрос ко мне:

Что вы возвращаете в качестве результата?

Если вы нашли человека, отображается ли список людей?

Или, если вы найдете место, список мест?

Или смесь обоих?

Я бы сказал, что если вы хотите вернуть список обоих, вам нужно что-то вроде этого:

  SELECT tblPerson.PersonID, tblPerson.LastName & ", " & tblPerson.FirstName, "Person"
  FROM tblPerson 
  WHERE tblPerson.LastName LIKE "Andrew*"
    OR tblPerson.FirstName  LIKE "Andrew*"

  UNION 

  SELECT tblVenue.Venue, tblVenue.Venue, "Venue" 
  FROM tblVenue
  WHERE tblVenue.Venue LIKE "Andrew*"
  ORDER BY Venue

Это даст список совпадений, указывающих, кто является человеком, а какое место проведения, и позволит вам затем выбрать один из них и открыть подробный вид (путем проверки значения в третьем поле).

Что вы определенно не хотите сделать, это:

  SELECT tblPerson.PersonID, tblPerson.LastName & ", " & tblPerson.FirstName, "Person"
  FROM tblPerson 

  UNION 

  SELECT tblVenue.Venue, tblVenue.Venue, "Venue" 
  FROM tblVenue

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...