可以使用单个查询搜索多个表吗? [MS Access / SQL Server]

时间:2008-12-22 12:54:10

标签: sql-server ms-access

所以我的目标是在应用程序中有一个搜索字段,可以搜索多个表并返回结果。

例如,其中两个表是“表演者”和“场地”,还有以下表演者:“John Andrews”,“Andrew Smith”,“John Doe”以及以下场地:“圣安德鲁教堂” ,“市政府”。有没有办法以某种方式返回前两个表演者和第一个搜索“安德鲁”的地方?

我的第一个想法是以某种方式将所有表聚合到一个包含三列的表中; “SearchableText”, “与resultType”, “ResultID”。第一列将包含我想要搜索的内容(例如Performer名称),第二列将显示正在显示的内容(例如Performer),第三列将显示项目的ID(注意:我的所有表都有自动递增的主键以方便) 。这个想法的问题是有可能以某种方式动态地执行此操作,或者我是否必须添加代码以使表格在执行者和场地表(可能通过触发器?)更新/添加/删除新行时自动填充。

我的应用程序是在SQL Server后端的MSAccess中编写的(我知道,但我别无选择)。我更喜欢通过MSAccess实现这一点,所以我不必在我的SQL Server上安装“searchme”表,但任何好的结果都是可以接受的:)

3 个答案:

答案 0 :(得分:2)

我认为您正在寻找“union”sql关键字

答案 1 :(得分:1)

我在SQL服务器中使用全文索引,只有一个包含可搜索文本的表,并在主表中分配链接到搜索表的密钥。这样您就可以按相关性订购结果。

答案 2 :(得分:0)

我认为你有一个架构问题。查询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子句。