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

Possible to search multiple tables with a single query? [MSAccess/SQL Server]

提问人:Andrew G. Johnson 提问时间:12/22/2008 更新时间:9/30/2013 访问量:8777

问:

因此,我的目标是在应用程序中有一个搜索字段,该字段将能够搜索多个表并返回结果。

例如,其中两个表是“表演者”和“场地”,还有以下表演者:“约翰·安德鲁斯”、“安德鲁·史密斯”、“约翰·多伊”和以下场所:“圣安德鲁教堂”、“市政厅”。有没有办法以某种方式返回前两名表演者和搜索“安德鲁”的第一个场所?

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

我的应用程序是在 SQL Server 后端之上用 MSAccess 编写的(我知道,我知道,但我别无选择)。我更希望通过 MSAccess 发生这种情况,这样我就不必在我的 SQL Server 上放置“searchme”表,但任何好的结果都是可以接受的:)

sql-server ms-access

评论


答:

2赞 Brann 12/22/2008 #1

我想你正在寻找“union”sql关键字

评论

0赞 David-W-Fenton 12/23/2008
如果您的表具有任何大小,这将导致查询效率非常低下,因为它不能使用索引。最好使用全文索引或编写在没有 UNION 的情况下查询多个表的 SQL。
1赞 Ady 12/22/2008 #2

我会在 SQL Server 中使用全文索引,使用一个包含可搜索文本的表,并在链接到搜索表的主表中保留键。这样,您就可以按相关性对结果进行排序。

评论

0赞 Andrew G. Johnson 12/22/2008
我将首先尝试UNION方法,如果速度太慢,我会考虑使用此方法
0赞 David-W-Fenton 12/23/2008 #3

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