如何解决内部联接后的自联接
我正在查找不同州中哪些城市具有相同的名称。城市名称和州名称位于单独的表(城市和州)中,并且可以通过单独的公共列进行内部连接。
select c1.city,c1.state,c2.city,c2.state
from cities
inner join states on cities.commonid = states.commonid
内部加入后,我需要自加入以执行如下功能
select c1.city,c2.state
from *joined table* c1 join
*joined table* c2
on c1.city = c2.city and c1.state <> c2.state
我想知道如何自连接一个表,该表是同一查询中另一个连接的结果 输出将是这样的
+----------+-------+--------+--------+
| city1 | state1|city2 |state2 |
+----------+-------+--------+--------+
| x | melb | x | syd |
| y | bris | y | ACT |
+----------+-------+--------+--------+
解决方法
我假设表 cities
有一个类似于 state_id
的列,它引用表 state_id
中的列 states
(将名称更改为列的实际名称).
首先使用条件为 cities
执行自联接:
c1.city = c2.city AND c1.state_id < c2.state_id
<
运算符确保每对城市只返回一次。
然后加入 states
的 2 个副本,因为每个副本都将用于获取 2 个城市中每个城市的州名:
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
,
您可以选择内部连接查询并为其指定别名。
然后就会变成下面这样...
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 个州存在一个城市名称,您打算如何显示它。这样你就会看到所有的字母顺序。
,我建议 CTE:
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 5000
EXPOSE 5001
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["src/Skybot.Web/Skybot.Web.csproj","src/Skybot.Web/"]
COPY ["src/Skybot.Application/Skybot.Application.csproj","src/Skybot.Application/"]
COPY ["src/Skybot.Domain/Skybot.Domain.csproj","src/Skybot.Domain/"]
COPY ["src/Skybot.Infrastructure/Skybot.Infrastructure.csproj","src/Skybot.Infrastructure/"]
RUN dotnet restore "src/Skybot.Web/Skybot.Web.csproj"
COPY . .
WORKDIR "/src/src/Skybot.Web"
RUN dotnet build "Skybot.Web.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Skybot.Web.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet","Skybot.Web.dll"]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。