0

私はかなり紛らわしいSQLiteクエリを持っているので、頭を完全に包み込むことができないようです。

次の4つのテーブルがあります。

表「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

テーブル「temp」

oldID (string/guid) | newID (string/guid)
------------------------------------------
   dont care          fff-fff
   dont care          ggg-ggg
   dont care          zzz

必要なのは、sIDがtemp.NewIDテーブルに存在しない場合に、指定された「t」に存在するMAX()sNumを取得できるようにすることです。

たとえば、T '000'が与えられた場合、'000'にはS'aaa-aaa'、'bbb-bbb'、'fff-fff'、および'ggg-ggg'がマップされます。ただし、「fff-fff」と「ggg-ggg」の両方がTEMPテーブルに存在します。つまり、「aaa-aaa」と「bbb-bbb」だけを確認する必要があります。したがって、ステートメントは「2」を返します。


どうすればこれを行うことができますか?

「temp」テーブルに存在しない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とその最大sNumのリストを提供するはずです(すべてが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

結果セットを特定のTに制限するには、S2TMapに参加してから、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 に答える