用于查找表中所有匹配项的 SQL 查询

SQL query to find all occurrence in table

提问人:mermosh 提问时间:10/25/2023 最后编辑:GuidoGmermosh 更新时间:11/6/2023 访问量:83

问:

我需要一个查询,它可以返回表中特定条件对的所有匹配项。 例如,我有这张表。我需要返回所有“开始停止”的支路,其中 startPointType 是 L 或 D,而 endPointType 不是 L 或 D。

起点 StartPointType 端点 EndPointType
1 xxx L AAA级 D
2 AAA级 L EEE电子电气 Z
3 EEE电子电气 Z TTT的 C
4 TTT的 C 呜呜 D
5 呜呜 L 呜呜 L
6 呜呜 L 呵呵 C
7 呵呵 C 三 k 党 B
8 三 k 党 B 公私合营 C
9 公私合营 C FFF系列 L
10 FFF系列 L 万维网 L

在此处输入图像描述

在上面的示例中,它应该返回

Start_Leg 起点 End_Leg 端点
2 AAA级 4 呜呜
6 呜呜 9 FFF系列

我能够找到第一对,但不知道如何获得所有对。 非常感谢您的帮助。

我尝试自行加入。

我期待得到所有的一对。

sql-server 数据库 sql-server-2008 联接

评论

1赞 Stu 10/25/2023
🚫📸 为什么应该不上传代码数据错误
0赞 jarlh 10/25/2023
不是”是否意味着“不是L或D”?
0赞 siggemannen 10/25/2023
为什么 3 是终点?而不是 4?
1赞 mermosh 10/25/2023
“is not”表示不是 L 也不是 D
0赞 mermosh 10/25/2023
4 应该是第一对的末端腿

答:

0赞 Gufus 11/6/2023 #1

考虑到帖子中所需的输出,我认为请求应该是:

  1. 起始记录的 StartPointType 位于 ('L','D') 中,而 EndPointType 不在 ('L','D') 中
  2. 停止记录的 StartPointType 不在 ('L','D') 中,EndPointType 不在 ('L','D') 中

如果我没有误解,以下查询给出了所需的结果:

select top 1 with ties StartLeg = a.leg
  ,a.StartPoint
  ,EndLeg = b.leg
  ,b.EndPoint
from MyTable a
inner join MyTable b
on a.leg<b.leg
 and b.StartPointType not in ('L','D')
 and b.EndPointType in ('L','D')
where a.StartPointType in ('L','D')
 and a.EndPointType not in ('L','D')
order by row_number() over (partition by a.leg order by b.leg)

其中 MyTable 是一个类似于帖子中的表格。我将其与自身连接起来,其中别名是“a”,我正在寻找开始记录,而“b”是“我正在寻找停止记录:这就是我在连接条件中编写 a.leg<b.leg 的原因;连接条件的其余部分是上面的点 (2),而条件是点 (1)。

我之所以写 select top 1 with tie 并在末尾按顺序排列,是因为我希望每个分区键只有一条记录,在我们的例子中是一条腿。如果有许多具有相同 a.leg 的记录,我只想保留具有较小 b.leg 的记录(这就是为什么在 row_number() i orber by b.leg 中)。

此解决方案在 sql server 2008 中不起作用,在这种情况下,我将使用 CTE(或您喜欢的临时表):

with tab as (select StartLeg = a.leg
  ,EndLeg = min(b.leg)
from MyTable a
inner join MyTable b
on a.leg<b.leg
 and b.StartPointType not in ('L','D')
 and b.EndPointType in ('L','D')
where a.StartPointType in ('L','D')
 and a.EndPointType not in ('L','D')
group by a.leg)

select t.StartLeg
  ,a.StartPoint
  ,t.EndLeg
  ,b.EndPoint
from tab t
inner join MyTable a
on t.Startleg=a.leg
inner join MyTable b
on t.Endleg=b.leg