Из Вашего вопроса я прочитал определение таблиц быть:
T1 -- a list of objects
x,
y,
z,
name -- primary key, hence unique
T2 -- a list of objects linked to an object in T1
name2, -- primary key
name1, -- foreign key to T1.name
w
Если у нас есть три объекта A, B и C все три будет появляться в T1. Если В и С связаны с А, Т2 будет (частности)
Name2 Name1
B A
C A
Нам даны х, у и т и хотим тройки объекта, которые связаны с объектами с й и y на их первой координате с w> t.
Как вы указываете, T1 содержит информацию об объектах и T2 о том, как связаны объекты. Чтобы получить сопоставимую информацию из более чем одной таблицы, вы используете синтаксис JOIN. Поскольку в связи есть два объекта, у вас должен быть отдельный JOIN для каждого. Одобрено ссылаться на таблицу более одного раза в запросе. Вы должны использовать псевдонимы, чтобы выяснить, какую роль выполняет таблица при каждом упоминании. Это дает что-то вроде
from T2 as linkage
inner join T1 as linked_from
on linked_from.name = T2.name1 -- note different columns in T2
inner join T1 as linked_to
on linked_to.name = T2.name2 -- note different columns in T2
Лично мне не нравится linked_from
и linked_to
, поскольку они являются неопределенными и общими. Вы должны использовать все, что является конкретным и значимым в контексте вашей проблемы.
Вы не говорите, относятся ли заданные x и y к связанному_объекту или связанному объекту. Это будет очень важно для вывода запроса, но в SQL это просто тривиально - просто используйте другой псевдоним - поэтому я предполагаю, что это родительский объект. Предложение где
where link_from.x = @x_given_value
and link_from.y = @y_given_value
and linkage.w > @t_given_value
Вам не нужно ставить дополнительные подзапросов в предложении SELECT, так как вы уже ссылаются все таблицы и таблицы-роли, необходимые в ОТ cluase. Таким образом, это становится
SELECT
link_to.x,
link_to.y as k,
linkage.w
Я уверен, что вы можете разработать заказ.
Помните о мощностях, связанных с вашей базой данных, то есть сколько строк соответствует каждому условию. Вы утверждаете, что x, y и z вместе являются уникальными. Поскольку поставляются только x и y, вы можете получить несколько возвращенных строк. Точно так же может быть много строк со значением w больше заданного значения t, даже для тех же имен1, значений name2. Будет много строк в T2 для каждой строки в T1.
Я понимаю, что это пример и что вы, вероятно, «упростили» имена для вопроса, но в любое время, когда вы обнаруживаете, что вы называете столбцы с числовым суффиксом, вы делаете что-то неправильно. Возможно, вы недостаточно нормализовались или, возможно, не поняли отношения между элементами данных.
Ищите вдохновение от Linq. Linq в значительной степени решает все проблемы, которые вы определили здесь. –
Вы можете попробовать развернуть базу данных и протестировать ее на http://sqlfiddle.com - или установить свою собственную локальную базу данных с помощью столбцов, которые вы знаете, и написать ответы на них. –
Мне сложно понять, что вам нужно. Можете ли вы обновить свой вопрос с помощью некоторых выборочных данных от T1 и T2 и какого результата вы ожидаете. –