棘手的SQLite查询,可以使用一些帮助

时间:2012-05-02 18:47:44

标签: sql sqlite join inner-join

我有一个相当混乱的 SQLite 查询,我似乎无法完全包围我的脑子。

我有以下四个表:

表“S”

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

表“T”

tID (string/guid) | ... other stuff
-----------------------------------
000
www
xxx
yyy
zzz

表“S2TMap”

sID    |    tID
-------------------
aaa-aaa    000
bbb-bbb    000
ccc-ccc    xxx
ddd-ddd    yyy
eee-eee    www
fff-fff    000
ggg-ggg    000

表“temp”

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)

谢谢!

3 个答案:

答案 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