【问题标题】:What would be the best way to write this query编写此查询的最佳方法是什么
【发布时间】:2009-07-14 03:28:00
【问题描述】:

我的数据库中有一个包含 1.1MM 记录的表。我的数据库中有另一个表,在字段名称“NAME”下有大约 2000 条记录。我想要做的是使用较小的表从表 1 中进行搜索,并在与较小的表记录匹配的位置提取记录。例如,表 1 有名字、姓氏。表 2 有名称,我想在表 1 中查找包含第一个名称字段或第二个名称字段中的任何表 2 名称的每条记录。我试着只做一个访问查询,但我的电脑就死机了。任何想法都会受到重视。

【问题讨论】:

  • 小问题,但如果忽略它可能会引起令人难以置信的头痛:NAME 是 Access 中的保留字,不应用作字段或对象名称。

标签: sql ms-access


【解决方案1】:

您是否考虑过以下几点:

Select Table1.FirstName, Table1.LastName 
from Table1 
where EXISTS(Select * from Table2 WHERE Name = Table1.FirstName) 
   or EXISTS(Select * from Table2 WHERE Name = Table1.LastName)

我之前发现在大型表上这可能比内部连接更好。

【讨论】:

    【解决方案2】:

    确保在 Table1.first_name、Table1.last_name 和 Table2.name 上创建索引。它们将大大加快您的查询速度。

    编辑:对于 Microsoft Access 2007,请参阅 CREATE INDEX

    【讨论】:

    • 哇,这几乎总是发生在我身上! ;-)
    【解决方案3】:

    请参阅上面有关索引的先前注释,但我相信从您的描述中,您想要类似:

    select table1.* from table1 
      inner join 
        table2 on (table1.first_name = table2.name OR table1.last_name = table2.name);
    

    【讨论】:

      【解决方案4】:

      应该是这样的,

      Select Table1.FirstName, Table1.LastName 
      from Table1 
      where Table1.FirstName IN (Select Distinct Name from Table2) 
         or Table1.LastName  IN (Select Distinct Name from Table2)
      

      还有其他各种方法可以运行相同的查询,我建议您查看每个查询的执行计划,以确定哪个查询最快。此外,在“where”条件中使用的列上创建索引也会加快查询速度。

      【讨论】:

        【解决方案5】:

        我同意 astander。根据我的经验,使用 EXIST 而不是 IN 会快很多。

        【讨论】:

          猜你喜欢
          • 2014-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-28
          • 2020-07-09
          • 2017-11-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多