我有一个相当混乱的 SQLite 查询,我似乎无法完全包围我的脑子。
我有以下四个表:
sID (string/guid) | sNum (integer)
-----------------------------------
aaa-aaa 1
bbb-bbb 2
ccc-ccc 3
ddd-ddd 4
eee-eee 5
fff-fff 6
ggg-ggg 7
tID (string/guid) | ... other stuff
-----------------------------------
000
www
xxx
yyy
zzz
sID | tID
-------------------
aaa-aaa 000
bbb-bbb 000
ccc-ccc xxx
ddd-ddd yyy
eee-eee www
fff-fff 000
ggg-ggg 000
oldID (string/guid) | newID (string/guid)
------------------------------------------
dont care fff-fff
dont care ggg-ggg
dont care zzz
如果temp.NewID表中不存在sID,我需要的是能够获得指定的“t”中存在的MAX()sNum。
例如,给定T'000','000'有S'aaa-aaa','bbb-bbb','fff-fff'和'ggg-ggg'映射它。然而,TEMF表中都存在'fff-fff'和'ggg-ggg',这意味着我只需要查看'aaa-aaa'和'bbb-bbb'。因此,该陈述将返回“2”。
我将如何做到这一点?
我正在考虑以下几行来选择“临时”表中不存在的s,但我不确定如何获得座位的最大值并且仅根据具体情况进行操作'T'
SELECT s.sID, s.sNum FROM s WHERE NOT EXISTS ( SELECT newID from temp where tmp.newID = s.sID)
谢谢!
答案 0 :(得分:2)
尝试一下:
select max(s.sNum) result from s2tmap st
join s on st.sId = s.sId
where st.tId = '000' and not exists (
select * from temp
where temp.newId = st.sId)
以下是fiddle。
另一种可能效率较低的选择是:
select max(s.sNum) result from s2tmap st
join s on st.sId = s.sId
where st.tId = '000' and st.sId not in (
select newId from temp)
答案 1 :(得分:1)
你很接近,你必须加入S2TMap然后加入T才能将结果集限制在给定的T。
SELECT MAX(s.sNum)
FROM s
INNER JOIN S2TMap m on m.sID = s.sID
INNER JOIN t on t.tID = m.tID
WHERE t.tID = '000'
AND NOT EXISTS (
SELECT newID FROM temp WHERE temp.newID = s.sID
)
答案 2 :(得分:1)
以下查询应该为您提供Ts及其最大sNums的列表(只要存在于S和S2TMap中):
SELECT t.tID, MAX(sNum)
FROM S s
JOIN S2TMap map on s.sID=map.sID
JOIN T t on map.tId=t.tID
LEFT JOIN temp tmp on s.sID=tmp.newID
WHERE tmp.newID IS NULL