sql - 如何关联不直接关联的列?
问题描述
我有这个数据:
label ui dc mapId
1 209459 50580-590 1
1 198440 50580-590 2
2 209459 50580-449 3
2 198440 50580-449 4
3 198440 43353-066 5
3 198440 43353-067 6
3 198440 43353-059 7
4 187878 89999-876 8
label
我使用该列将其插入并映射到该查询中:
DECLARE @dc TABLE (label int, dc varchar(50))
DECLARE @ui TABLE (label int, ui varchar(50))
INSERT INTO @DC
VALUES (1, '50580-590'), (2, '50580-449'), (3, '43353-066'), (3, '43353-067'), (3, '43354-059'), (4, '89999-876')
INSERT INTO @UI
VALUES (1, '209459'), (1, '198440'), (2, '209459'), (2, '198440'), (3, '198440'), (4, '187878')
SELECT *
FROM @dc A
INNER JOIN (
SELECT *
FROM @ui
) B
ON A.label = B.label
我试图找到以某种方式相互关联的行。例如,我想查找 where 的行dc = 43353-059
以及与该行关联的 ui,这将是 where 的行mapId = 7
。在该行中ui = 198440
,在我这样做之后,我想查找 ui 为 198440 的行,但随后我想查看标签。如果取 row where ,带有has的mapId = 2
ui也关联到. 这样你就可以说是相关的。使用该逻辑,我尝试使用顶部的数据进行查询并获得以下结果:198440
label of 1 but on mapId 1 ui of 209459
label of 1
mapId 1 - 7
label ui dc masterId
1 209459 50580-590 1
1 198440 50580-590 2
3 209459 50580-449 3
3 198440 50580-449 4
3 198440 43353-066 5
3 198440 43353-067 6
3 198440 43353-059 7
4 187878 89999-876 1
由于我无法以任何方式将 mapId 8 与其他行相关联,因此我从 masterId 列上的 1 开始。任何帮助表示赞赏。
解决方案
请看一看
DECLARE @Crossings TABLE (Label INT,Value INT)
INSERT INTO @Crossings(label,[Value])
SELECT DISTINCT up.Label,up.Value
FROM (
SELECT dc.label AS [Label],dc.RelatedLabel AS [1],ui.label AS [2],ui.RelatedLabel AS [3]
FROM (
SELECT dc.label,dc2.label AS [RelatedLabel]
FROM @dc dc
LEFT JOIN @dc dc2 ON dc2.dc = dc.dc
) dc
INNER JOIN (
SELECT ui.label,ui2.label AS [RelatedLabel]
FROM @ui ui
LEFT JOIN @ui ui2 On ui2.ui = ui.ui
) ui ON ui.label = dc.label OR ui.label = dc.RelatedLabel OR ui.RelatedLabel = dc.RelatedLabel
) a
UNPIVOT(Value FOR Param IN ([1],[2],[3])) up
ORDER BY up.label
;
DECLARE @Group TABLE (Label INT,TheGroup NVARCHAR(255))
;WITH cte AS (
SELECT DISTINCT g.label,g2.label AS [RelatedLabel]
FROM @Crossings g
LEFT JOIN @Crossings g2 ON (g2.[Value] = g.[label] OR g2.[label] = g.[Value])
)
INSERT INTO @Group(Label,TheGroup)
SELECT DISTINCT d.Label
,STUFF((SELECT DISTINCT ',' + CONVERT(NVARCHAR(50),r.RelatedLabel) FROM cte r WHERE r.Label = d.Label ORDER BY 1 FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)'),1,1,'') AS [TheGroup]
FROM cte d
;
SELECT dc.label,dc.dc,ui.ui
,ROW_NUMBER()OVER(ORDER BY (SELECT 1)) AS [MapId]
,ROW_NUMBER()OVER(PARTITION BY g.TheGroup ORDER BY dc.label) AS [MasterId]
FROM @dc dc
INNER JOIN @ui ui ON ui.label = dc.label
INNER JOIN @Group g ON g.Label = dc.label
;
推荐阅读
- java - 无法加载请求的类:org.hsqldb.jdbcDriver
- python - 谷歌分析小部件的问题
- html - 影响桌子的高度
- laravel - Laravel Livewire 基于下拉选择的自动填充输入框
- c# - zsh:找不到命令:dotnet-ef
- firebase - 我可以更改 Firebase RTDB 中的默认数据库吗?
- akka - 在 Flink 中使用分区时遇到错误(...收到不正确的幻数)异常。我该如何解决?
- ansible - Ansible 循环遍历嵌套的清单列表
- robotframework - 获取元素计数未能验证文本和计数
- android - 如何使用 Fiddler 抓取使用 HTTP 连接方法的手机应用程序?