0

我的查询:

SELECT source.name, file_info.*  
from FILE_INFO  
JOIN source  
ON source.id = file_info.source_ID  
where file_info.source_ID in 
     (select ID from Source where name like 'Donatello.%');  

我的表:

FILE_INFO    
FILE_NAME | FILE_ID | SOURCE_ID | DATE_SEEN | CURRENT_STATUS  

SOURCE  
NAME | ID | CATEGORY   

背景:

在我的数据库中,文件与提供它们的来源相关联。每个文件都有一个 FILE_ID,每个源都有一个 ID(与表 FILE_INFO 中的 SOURCE_ID 相同)。但是,表 FILE_INFO 不包含与 SOURCE_ID 关联的名称。

我正在尝试打印表 FILE_INFO 中的所有行以及相应的源名称,此外,我只想要提供该文件的源以“DONATELLO”开头的行。

此查询对我有用,但运行速度非常慢。我的代码有更好的方法吗?在我添加最后一个“where”子句之前,它工作正常。当包括在内时,它的运行速度很慢。

感谢您的意见。

4

5 回答 5

2

这不一样吗?

SELECT source.name, file_info.*  
FROM FILE_INFO  
    JOIN source  
        ON source.id = file_info.source_ID  
WHERE source.name like 'Donatello.%'
于 2013-10-08T13:09:16.117 回答
1

您是否在表中的name列上有索引source

你为什么不这样写你的查询:

SELECT source.name, file_info.*  
from FILE_INFO  
JOIN source  
ON source.id = file_info.source_ID  
where source.name like 'Donatello.%';
于 2013-10-08T13:12:19.603 回答
1

YouIN子句使用子查询,并source再次查询表。

为什么不把你的 SQL 简单如下?

SELECT source.name, file_info.*  
from FILE_INFO  
JOIN source  
ON source.id = file_info.source_ID  
where source.name like 'Donatello.%';  
于 2013-10-08T13:09:58.927 回答
0

下面的呢?

SELECT source.name, file_info.*  
from FILE_INFO  
JOIN source  
ON source.id = file_info.source_ID and source.name like 'Donatello.%';
于 2013-10-08T13:12:44.767 回答
0

将条件更改为简单条件并反转表格顺序:

SELECT source.name, file_info.*  
from source   
JOIN FILE_INFO
  ON source.id = file_info.source_ID  
where source.name like 'Donatello.%'

source(name)在和中具有索引file_info(source_ID)

这会更快,因为可以将 where 子句监视到连接表列表中的第一个表,因此可以将索引与条件一起使用。

于 2013-10-08T13:18:03.157 回答