有時我想加入一條記錄,我可以輕鬆識別爲「按此排序並選擇第一條記錄」。我想知道這裏的最佳做法。SQL以自定義排序順序加入第一條記錄
例如在我的數據模型中我有服務和實現。服務可能有多個實現。實現有版本號;可以安裝零個或多個實現,並且還可以啓用其中的一個。現在我想使用以下規則爲每個服務選擇「當前實現」:
- 如果沒有安裝任何內容,那麼當前的實現是最近的一個。
- 如果安裝了多個安裝,那麼當前是啓用的或者如果沒有啓用,則再次是最新的。
一些例子:
Service Version Installed Enabled
======= ======= ========= =======
A 1 False False
A 2 False False <- current for service A because most recent
B 1 True False <- current for service B because installed
B 2 False False
C 1 True False
C 2 True False <- current for service C because most recent
C 3 False False among installed
D 1 True True <- current for service D because enabled
D 2 True False
我想,如果我有點被這些田裏挖第一個記錄,它會做的伎倆。即我這樣做:
SELECT s.service, <other service fields>, i.version, <other impl. fields>
FROM service s, implementation i
WHERE i.rowid == (
SELECT rowid
FROM implementation o
WHERE o.service == s.service
ORDER BY installed DESC, enabled DESC, version ASC)
更新。我猜這是一個比較特殊的SQLite。首先,rowid
是SQLite使用的內部記錄標識。其次,在SQLite中,此上下文中的SELECT
表達式返回單個值。我想這可能被改寫成一個更通用的SQL是這樣的:
...
FROM service s, implementation i
WHERE i.service == s.service
AND i.version == (
SELECT version
FROM ...
ORDER BY ...
LIMIT 1)
它在這裏工作,但有時沒有rowid
或其他單一領域,可以作爲一個標識符。有沒有其他方法可以獲得相同的結果?也許更通用一些? (對我來說更具體的東西也沒關係,只要它是SQLite的特定:)
是否有某些原因您不使用INNER JOIN? –
你確定這可以嗎?因爲子查詢可能會返回多於一行,並且您在rowid上使用了相等運算符。 – NullUserException
我可以,但我不明白它會在這裏有什麼不同。一個內部聯接會給我所有匹配的實現,這可以作爲一個起點,但是我想選擇一個以任何排序順序排在第一位的實現:) –