提问人:Andrew G. Johnson 提问时间:12/22/2008 更新时间:9/30/2013 访问量:8777
可以使用单个查询搜索多个表吗?[MSAccess/SQL Server]
Possible to search multiple tables with a single query? [MSAccess/SQL Server]
问:
因此,我的目标是在应用程序中有一个搜索字段,该字段将能够搜索多个表并返回结果。
例如,其中两个表是“表演者”和“场地”,还有以下表演者:“约翰·安德鲁斯”、“安德鲁·史密斯”、“约翰·多伊”和以下场所:“圣安德鲁教堂”、“市政厅”。有没有办法以某种方式返回前两名表演者和搜索“安德鲁”的第一个场所?
我的第一个想法是以某种方式将所有表聚合到一个包含三列的表中;“SearchableText”,“ResultType”,“ResultID”。第一列将包含我想要搜索的任何内容(例如执行者名称),第二列将显示正在显示的内容(例如执行者),第三列将显示项目的 ID(注意:为了方便起见,我的所有表都有自动递增的主键)。这个想法的问题是,是否可以以某种方式动态地执行此操作,或者我是否必须添加代码才能有一个表格,每当从表演者和场地表中更新/添加/删除新行时,该表格就会自动填充(也许通过触发器?
我的应用程序是在 SQL Server 后端之上用 MSAccess 编写的(我知道,我知道,但我别无选择)。我更希望通过 MSAccess 发生这种情况,这样我就不必在我的 SQL Server 上放置“searchme”表,但任何好的结果都是可以接受的:)
答:
我想你正在寻找“union”sql关键字
评论
我会在 SQL Server 中使用全文索引,使用一个包含可搜索文本的表,并在链接到搜索表的主表中保留键。这样,您就可以按相关性对结果进行排序。
评论
我认为您有一个架构问题。查询 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 子句。
评论