2011-03-19 190 views
1

我有3列的表格:身份证(的人),城市(哪个人访问过)和日期(他的访问)。 我需要选择在特定日期之间在洛杉矶市内的所有人(他们的ID),这些人在某个其他特定日期也在纽约市。SELECT .. IN的替代方案(..)

这里是我现在运行查询的一个例子:

SELECT DISTINCT id 
FROM places 
WHERE date >= '2011-03-18' AND 
     date < '2011-03-19' AND 
     city = 'los angeles' AND 
     id IN (SELECT DISTINCT id 
      FROM places 
      WHERE date >= '2011-03-15' AND 
        date < '2011-03-16' AND 
        city = 'chicago' 
      GROUP BY id); 

什么我也可以? 是否有任何其他查询可以使用?这个选择太慢了。

回答

8

使用连接(用别名),而不是一个子查询的性能应该更好:

SELECT places.id 
    FROM places 
     JOIN places AS places2 ON places2.id = places.id 
    AND places2.date >= '2011-03-15' 
    AND places2.date < '2011-03-16' 
    AND places2.city = 'chicago' 
    WHERE places.date >= '2011-03-18' 
    AND places.date < '2011-03-19' 
    AND places.city = 'los angeles' 
GROUP BY places.id; 
+0

是否存在(..)中的字符数限制,因为有LISTAGG,它只能呈现到4000? – 2015-11-30 08:55:54

1
SELECT id 
FROM places AS p1 
INNER JOIN AS p2 ON p1.id = p2.id AND p2.date >= '2011-03-15' AND p2.date < '2011-03-19' 
    AND p2.city = 'chicago' 
WHERE p1.date >= '2011-03-18' AND p1.date < '2011-03-19' AND p1.city = 'los angelis' 
1

尝试内加入

SELECT DISTINCT p1.id 
FROM places p1 
INNER JOIN places p2 ON p1.id = p2.id AND 
     p2.date >= '2011-03-18' AND 
     p2.date < '2011-03-19' AND 
     p2.city = 'los angeles' 
WHERE p1.date >= '2011-03-18' AND 
     p1.date < '2011-03-19' AND 
     p1.city = 'los angeles' AND 

检查表上的索引,看看你有任何关于城市和日期。

2

首先你需要确保你有相关的索引。在这种情况下,它可能是一个包含两列日期和城市的索引。之后,您可以进行查询,并将性能与此处提出的查询进行比较。内连接可能比你已经得到的更快。

我的版本在SQL Server中工作。我也可能在其他DBMS中工作。

select id 
from places 
where [date] >= '2011-03-18' AND 
     [date] < '2011-03-19' AND 
     city = 'los angeles' 
intersect  
select id 
from places 
where [date] >= '2011-03-15' AND 
     [date] < '2011-03-16' AND 
     city = 'chicago';