У меня есть SQL-запрос, который я пытаюсь написать, но я не совсем уверен, как заставить его работать.
У меня есть три таблицы: "s", "t" и"st" (это карта между "s" и "t".
table s
=======
primary key sID | val
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
a 0
b 1
c 5
d 6
e 7
table t
=======
primary key tID | val
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
nul -1
bbb 2
ccc 3
ddd 4
table st
========
foreign key sID | foreign key tID
(unique) | (multiple sID to one tID, meaning tID is not unique)
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
a ddd
b ccc
c nul
d ccc
e bbb
Итак, все 's' должны быть сопоставлены с 't', но те, которые не находятся в реальномВместо этого 't' сопоставляется с значением по умолчанию / null 't' (nul).
Значения val уникальны как для 's', так и для 't', что означает, что если таблица 's' имеет 1, тотаблица 't' не может иметь 1.
Так что моя проблема заключается в следующем:
При заданном наборе значений (которое может быть либо 's'или 't'), мне нужно получить sID и tID в таблице 'st' соответствующих идентификаторов. Проблема в том, что если в наборе есть буква 's', а в наборе нет 't', то янужно получить значения (sID, 'nul'), а не (sID, tID).
Например, учитывая значения (3, 1, 6), он вернет пары: (b, ccc); (d, ccc);
Учитывая значения (0,4), она вернет пару: (a, ddd)
Однако, учитывая значение valИбо (6), он должен был бы вернуть (d, nul ), так как val 3 (что соответствует ccc, которому соответствует d) не входит в набор.Я не нуждаюсь в null 's', просто null 't'.
Я думал об использовании следующего утверждения, но это не поможет мне с возвратом "id, nul", еслив наборе только «s», но не «t».
SELECT st.sID, st.tID FROM t, st WHERE t.tID=st.tID AND (t.val=%_VAL1_% OR t.val=%_VAL_2 OR ......);
Это дает мне все, что имеет «t» и «s» в наборе (на самом деле это дает мне все »s 'связан с любым' t 'из набора), но он не дает мне "s", которые сами по себе.
Возможно, я мог бы постобработать все, что находится в "s", ноне в 'st', но я хотел бы избежать этого, если это возможно.
У кого-нибудь есть какие-либо предложения?Я довольно застрял.
Спасибо!
(примечание: s, t и st не мои настоящие имена таблиц, не волнуйтесь. Кроме того, первичные ключина самом деле текстовые идентификаторы GUID, к сожалению, но я попытался упростить их различие)