2008-12-22 94 views
0

因此,我的目标是在应用程序中有一个搜索字段,能够搜索多个表并返回结果。可以使用单个查询搜索多个表吗? [MSAccess/SQL Server]

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

我的第一个想法是以某种方式将所有表格汇总成一个单列表, “SearchableText”, “与resultType”, “ResultID”。第一列将包含我想要搜索的任何内容(例如Performer名称),第二列将说明正在显示的内容(例如Performer),第三列将说明该项目的ID(注意:为了方便起见,我的所有表格都自动递增主键) 。这个想法的问题是有可能以某种方式动态地做到这一点,或者我必须添加代码来创建一个表格,该表格在执行者和场地表格更新/添加/删除新行(可能通过触发器?)时自动填充。

我的应用程序是在MSAccess(我知道,我知道,但我别无选择)在SQL Server后端编写。我更喜欢这种情况通过MSAccess,所以我不必有一个“搜索”表坐在我的SQL Server,但任何好的结果是可以接受的:)

回答

2

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

+0

这将导致非常低效的查询,如果你的表是任何大小的,因为它不能使用索引。你最好使用全文索引或者编写SQL来查询没有UNION的多个表。 – 2008-12-23 03:48:32

1

我会在SQL服务器中使用全文索引,使用可搜索文本的单个表,并在主表中链接到搜索表的外键。这样您就可以按照相关性排序您的结果。

+0

我要先尝试UNION方法,如果速度太慢,我会考虑这种方法 – 2008-12-22 12:59:56

0

我认为你有一个架构问题。查询联盟几乎总是证明这一点(尽管不是所有情况)。

对我的问题是:

你回来的结果是什么?

如果你找到一个人,你是否显示一个人的列表?

或者如果你找到一个场地,场馆列表?

或者两者兼有?

我会说,如果你想返回两者的列表,然后你会想是这样的:

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 

然后保存这一点,试图查询它的第2列。这将是非常低效的。您希望您的WHERE子句位于可通过索引搜索的字段上,这意味着UNION的每个子查询都需要具有适当的WHERE子句。