假设我有2张桌子。第一个表table_1包含每个发布的内容,包括
table_1
title,
author name,
email,
city_name, etc.
第二个表提供了table_1的查找。它有2列,
table_2
city_id and
city_name.
例如,city_id = 1对应纽约,city_id = 2对应芝加哥......依此类推。在table1的“city”列下,列出了city_id,可以很容易地与表2连接,生成可读的城市名称。
以下声明是否与使用带有city_id的WHERE一样有效?原因是我将基于一个字符串的城市过滤结果,我不希望(或需要?)将每个输入与表2中的匹配ID号相关联。
SELECT table1.city, table2.city_name
FROM table1
WHERE table2.city_name=(input city name)
JOIN table2.city_name ON table2.city_id = table1.city
答案 0 :(得分:1)
因为联接是内部联接,所以以下内容应该会导致等效的执行计划。(也就是说,应该 表现出相同的性能特性 - 清楚地编写SQL并让SQL引擎进行脏优化工作。)
如其他答案所示:
SELECT table1.*, table2.city_name
FROM table1
JOIN table2 ON table1.city_id = table2.city_id
WHERE table2.city_name = (city_input);
而且,正如我所认为的那样是问题中提出的“优化形式”:
SELECT table1.*, t2.city_name
FROM table1
JOIN (SELECT * FROM table2
WHERE table2.city_name = (city_input)) AS t2
ON table1.city_id = t2.city_id
这是因为SQL遵循的Relation Algebra模型;至少在RA下,这里的相等(“选择”)可以在连接中移动(RA中的“自然连接”),同时保持相同的语义。当然,“为了确定”,运行查询分析。最基本的形式是使用EXPLAIN
。
快乐的编码。
答案 1 :(得分:0)
我并没有完全遵循问题所在,但我会说处理查询的正确方法,你需要过滤特定的城市名称,而不是ID,就像这样:
SELECT table1.*, table2.city_name
FROM table1
JOIN table2 ON table1.city_id = table2.city_id
WHERE table2.city_name = (city_input);