0

我有一个相当混乱的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

药片”

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

表“温度”

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' 映射到它。但是,TEMP 表中同时存在“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)

谢谢!

4

3 回答 3

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)

这是玩的小提琴。

另一种可能效率较低的选择是:

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)
于 2012-05-02T19:00:29.930 回答
1

以下查询应为您提供 T 列表及其最大 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
于 2012-05-02T19:00:09.670 回答
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
    )
于 2012-05-02T18:55:07.877 回答