约束
表格
名称:地点
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | 0 | auto_increment |
| zip_code | varchar(12) | NO | | | |
| city | varchar(64) | NO | MUL | | |
| county | varchar(64) | NO | MUL | | |
| state | varchar(64) | NO | MUL | | |
| info | varchar(99) | NO | | | |
+-----------+-------------+------+-----+---------+----------------+
名称:地址
+------------------+---------------+------+-----+-------+-----------+
| Field | Type | Null | Key | Default | Extra |
+------------------+---------------+------+-----+-----------+-------+
| id | int(11) | NO | PRI | 0 | |
| address_one | varchar(255) | NO | | | |
| address_two | varchar(255) | NO | | | |
| city | varchar(30) | NO | MUL | | |
| state | varchar(25) | NO | MUL | | |
| zip_code | varchar(7) | NO | MUL | NULL | |
| country_code | char(2) | YES | | | |
+------------------+---------------+------+-----+-----------+-------+
问题
state
。问题
我需要从位置表中获取states
的{{1}}唯一列表,其中地址表格中各个info
。
我所拥有的任何联接,不使用子查询,都会永远占用。
哪些查询符合约束?
答案 0 :(得分:1)
子查询是一个性能问题,这是一个神话。有时他们是;有时他们不是。没有这么简单的规则。
在你的情况下,我可能会建议:
select l.*
from (select distinct state, info
from locations l
) l
where exists (select 1
from addresses a
where a.state = l.state
);
为了提高性能,您需要locations(state, info)
和addresses(state)
上的索引。
有两个子查询,但有了适当的索引,这可能只是表达这种逻辑的最快方式。
答案 1 :(得分:0)
您可以使用:
SELECT state, info FROM locations LEFT JOIN addresses USING (state) WHERE address_one IS NOT NULL GROUP BY state;
该查询不使用子查询。