Sql 内部联接后的自联接
我正在寻找在不同的州有相同名字的城市。城市名称和州名称位于单独的表cities和state中,可以通过单独的公共列进行内部连接Sql 内部联接后的自联接,sql,join,self-join,Sql,Join,Self Join,我正在寻找在不同的州有相同名字的城市。城市名称和州名称位于单独的表cities和state中,可以通过单独的公共列进行内部连接 select c1.city, c1.state, c2.city, c2.state from cities inner join states on cities.commonid = states.commonid 在内部连接之后,我需要自连接来执行如下功能 select c1.city, c1.state, c2.city, c2.state from *
select c1.city, c1.state, c2.city, c2.state
from cities
inner join states on cities.commonid = states.commonid
在内部连接之后,我需要自连接来执行如下功能
select c1.city, c1.state, c2.city, c2.state
from *joined table* c1 join
*joined table* c2
on c1.city = c2.city and c1.state <> c2.state
您可以选择内部联接查询并为其指定别名 然后它会变成下面的样子
Select c.city,c.state from
(Select City,state from cities inner join states where cities.id = states.id) as c
现在为c创建一个自连接。我将对所有拥有多个州的城市执行预查询。然后连接到states表以查看遇到的状态
select
Duplicates.city,
s.state
from
( select c1.city
from cities c1
group by c1.city
having count(*) > 1 ) Duplicates
JOIN cities c2
on Duplicates.city = c2.city
JOIN states s
on c2.commonid = s.commonid
order by
Duplicates.city,
s.state
通过不尝试只对两个城市/州进行交叉统计,您将得到一个列表。如果一个城市的名字存在于5个州,你将如何计划显示它。通过这种方式,您将看到所有按字母顺序排列的数据。我假设表cities有一个类似列的state\u id,它引用了表states中的列state\u id,将名称更改为列的实际名称。
首先,对具备以下条件的城市进行自连接:
c1.city = c2.city AND c1.state_id < c2.state_id
我建议使用CTE:
with cs as (
select c.name as city_name, s.name as state_name
from cities c join
states s
on c.commonid = s.commonid
)
select cs1.*, cs2.*
from cs cs1 join
cs cs2
on cs1.name = cs2.name and cs1.state <> cs2.state;
您的查询看起来是正确的。有什么问题,,您可以添加示例数据来解释您想要的内容吗?请提供示例数据和输出以演示您的问题@TimBiegeleisen我编辑了帖子~我不知道如何将内部联接和自联接连接在一起为什么不在更新联接后加入整个解决方案?在这种情况下尝试自联接c会返回一个错误关系c不存在第5行:在c.city=c2.city和c.state c2上连接c c2。state@PeterSmith关于这个错误有什么想法吗?需要查看完整的查询;样本数据不只是结果也会很好;操作员刚刚解决了我的问题~谢谢
SELECT c1.city city1, s1.state state1,
c2.city city2, s2.state state2
FROM cities c1
INNER JOIN cities c2 ON c1.city = c2.city AND c1.state_id < c2.state_id
INNER JOIN states s1 ON s1.state_id = c1.state_id
INNER JOIN states s2 ON s2.state_id = c2.state_id
ORDER BY city1
with cs as (
select c.name as city_name, s.name as state_name
from cities c join
states s
on c.commonid = s.commonid
)
select cs1.*, cs2.*
from cs cs1 join
cs cs2
on cs1.name = cs2.name and cs1.state <> cs2.state;