所以我的目标是在应用程序中有一个搜索字段,可以搜索多个表并返回结果。
例如,其中两个表是“表演者”和“场地”,还有以下表演者:“John Andrews”,“Andrew Smith”,“John Doe”以及以下场地:“圣安德鲁教堂” ,“市政府”。有没有办法以某种方式返回前两个表演者和第一个搜索“安德鲁”的地方?
我的第一个想法是以某种方式将所有表聚合到一个包含三列的表中; “SearchableText”, “与resultType”, “ResultID”。第一列将包含我想要搜索的内容(例如Performer名称),第二列将显示正在显示的内容(例如Performer),第三列将显示项目的ID(注意:我的所有表都有自动递增的主键以方便) 。这个想法的问题是有可能以某种方式动态地执行此操作,或者我是否必须添加代码以使表格在执行者和场地表(可能通过触发器?)更新/添加/删除新行时自动填充。
我的应用程序是在SQL Server后端的MSAccess中编写的(我知道,但我别无选择)。我更喜欢通过MSAccess实现这一点,所以我不必在我的SQL Server上安装“searchme”表,但任何好的结果都是可以接受的:)
答案 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子句。