【发布时间】:2022-10-15 01:59:47
【问题描述】:
为了更好地说明我的问题图片,以下数据集包含包含“范围”动物的房间。为了表示范围,每只动物都在单独的表中分配了一个序列号。有不同的动物类型,每种动物的顺序都是“重置”的。
表 A
| RoomId | StartAnimal | EndAnimal | GroupType |
|---|---|---|---|
| 1 | Monkey | Bee | A |
| 1 | Lion | Buffalo | A |
| 2 | Ant | Frog | B |
表 B
| Animal | Sequence | Type |
|---|---|---|
| Monkey | 1 | A |
| Zebra | 2 | A |
| Bee | 3 | A |
| Turtle | 4 | A |
| Lion | 5 | A |
| Buffalo | 6 | A |
| Ant | 1 | B |
| Frog | 2 | B |
期望的输出
根据开始-结束条目获取每个房间的所有动物,例如
| RoomId | Animal |
|---|---|
| 1 | Monkey |
| 1 | Zebra |
| 1 | Bee |
| 1 | Lion |
| 1 | Buffalo |
| 2 | Ant |
| 2 | Frog |
我已经能够通过首先创建一个视图,其中房间具有其开始和结束序列号,然后将它们与比较范围的动物列表连接起来,从而获得所需的输出。
问题是这在我的真实数据集中表现不佳,其中有大约 1 万个房间和大约 34 万只动物。有没有我没有看到的不同(更好)的方法来解决这个问题?
我正在使用的示例小提琴:https://dbfiddle.uk/RnagCTf0
我试过的查询是
WITH fullAnimals AS (
SELECT DISTINCT(RoomId), a.[Animal], ta.[GroupType], a.[sequence] s1, ae.[sequence] s2
FROM [TableA] ta
LEFT JOIN [TableB] a ON a.[Animal] = ta.[StartAnimal] AND a.[Type] = ta.[GroupType]
LEFT JOIN [TableB] ae ON ae.[Animal] = ta.[EndAnimal] AND ae.[Type] = a.[Type]
)
SELECT DISTINCT(r.Id), Name, b.[Animal], b.[Type]
FROM [TableB] b
LEFT JOIN fullAnimals ON (b.[Sequence] >= s1 AND b.[Sequence] <= s2)
INNER JOIN [Rooms] r ON (r.[Id] = fullAnimals.[RoomId]) --this is a third table that has more data from the rooms
WHERE b.[Type] = fullAnimals.[GroupType]
谢谢!
【问题讨论】:
-
在问题本身中发布表定义和实际查询。 340K 不是很多数据。如果这些列被索引覆盖,那么您应该没有问题。
-
JOIN 和
sequence列是否已编入索引?
标签: sql sql-server join set query-optimization