提问人:mermosh 提问时间:10/25/2023 最后编辑:GuidoGmermosh 更新时间:11/6/2023 访问量:83
用于查找表中所有匹配项的 SQL 查询
SQL query to find all occurrence in table
问:
我需要一个查询,它可以返回表中特定条件对的所有匹配项。 例如,我有这张表。我需要返回所有“开始停止”的支路,其中 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系列 |
我能够找到第一对,但不知道如何获得所有对。 非常感谢您的帮助。
我尝试自行加入。
我期待得到所有的一对。
答:
0赞
Gufus
11/6/2023
#1
考虑到帖子中所需的输出,我认为请求应该是:
- 起始记录的 StartPointType 位于 ('L','D') 中,而 EndPointType 不在 ('L','D') 中
- 停止记录的 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
评论