為了更好地說明我的問題圖片,以下資料集包含包含“范圍”動物的房間。為了表示范圍,每只動物都在單獨的表中分配了一個序列號。有不同的動物型別,每種動物的順序都是“重置”的。
表 A
| 房間號 | 開始動物 | 終結動物 | 組型別 |
|---|---|---|---|
| 1 | 猴 | 蜜蜂 | 一個 |
| 1 | 獅子 | 水牛 | 一個 |
| 2 | 螞蟻 | 青蛙 | 乙 |
表 B
| 動物 | 序列 | 型別 |
|---|---|---|
| 猴 | 1 | 一個 |
| 斑馬 | 2 | 一個 |
| 蜜蜂 | 3 | 一個 |
| 龜 | 4 | 一個 |
| 獅子 | 5 | 一個 |
| 水牛 | 6 | 一個 |
| 螞蟻 | 1 | 乙 |
| 青蛙 | 2 | 乙 |
期望的輸出
根據開始-結束條目獲取每個房間的所有動物,例如
| 房間號 | 動物 |
|---|---|
| 1 | 猴 |
| 1 | 斑馬 |
| 1 | 蜜蜂 |
| 1 | 獅子 |
| 1 | 水牛 |
| 2 | 螞蟻 |
| 2 | 青蛙 |
我已經能夠通過首先創建一個視圖,其中房間具有其開始和結束序列號,然后將它們與比較范圍的動物串列連接起來,從而獲得所需的輸出。
問題是這在我的真實資料集中表現不佳,其中有大約 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]
謝謝!
uj5u.com熱心網友回復:
洗掉聚合的一種選擇是使用以下聯接:
- 在 TableA 和 TableB 之間,收集“ a.StartAnimal ”id
- 在 TableA 和 TableB 之間,收集“ a.EndAnimal ”id
- 在 TableB 和前兩個 TableB 之間,僅收集匹配的“ Type ”上的“ a.StartAnimal ”id 和“ b.StartAnimal ”id兩個值之間的 b.Sequence 行。
- 在 Table A 和 Rooms 之間,收集房間資訊
SELECT r.*, b.Animal, b.Type
FROM TableA a
INNER JOIN TableB b1 ON a.StartAnimal = b1.Animal
INNER JOIN TableB b2 ON a.EndAnimal = b2.Animal
INNER JOIN TableB b ON b.Sequence BETWEEN b1.Sequence AND b2.Sequence
AND a.GroupType = b.Type
INNER JOIN Rooms r ON r.Id = a.roomId
在此處查看更新的演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/515046.html
上一篇:從連接sql創建一個額外的行?
