2015-12-14 3 views
0

Я пытаюсь написать запрос, который объединяет данные из двух таблиц. Обе таблицы содержат информацию об определенных объектах. Объект однозначно определяется тройкой (x, y, z) (каждый x, y и z имеют отдельный столбец в T1), а также его имя (первичный ключ в T1). В T2 первичный ключ - имя2. Также есть столбец name1, который указывает объект, с которым связан объект name2, и столбец w. Таким образом, T1 содержит имена объектов и их тройки, в то время как T2 сообщает нам, какие объекты связаны («связанный» не является эквивалентом, если объект1 связан с объектом2, то объект2 не связан с объектом 1).Вложенный запрос между двумя таблицами

Нам заданы x, y и t и нужны тройки объекта, которые связаны с объектами с x и y в их первой координате с w> t.

Я пытался написать запрос, где нам нужно совпадения объекта с определенным именем:

SELECT 
    (SELECT x FROM T1 WHERE name=name2), 
    (SELECT y FROM T1 where name=name2) AS k, 
    w 
FROM T2 
WHERE name1=nn3 
AND w>t 
ORDER BY k; 

, но я не могу получить, как писать, когда мы можем иметь более одного объекта от T1.

У меня нет доступа к базе данных, я знаю только столбцы таблиц, поэтому мне сложно решить эту проблему, не пытаясь ее обнаружить в базе данных. Я смущен, перейдя с T1 на T2 обратно на T1 снова.

+0

Ищите вдохновение от Linq. Linq в значительной степени решает все проблемы, которые вы определили здесь. –

+0

Вы можете попробовать развернуть базу данных и протестировать ее на http://sqlfiddle.com - или установить свою собственную локальную базу данных с помощью столбцов, которые вы знаете, и написать ответы на них. –

+1

Мне сложно понять, что вам нужно. Можете ли вы обновить свой вопрос с помощью некоторых выборочных данных от T1 и T2 и какого результата вы ожидаете. –

ответ

2

Из Вашего вопроса я прочитал определение таблиц быть:

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.

Я понимаю, что это пример и что вы, вероятно, «упростили» имена для вопроса, но в любое время, когда вы обнаруживаете, что вы называете столбцы с числовым суффиксом, вы делаете что-то неправильно. Возможно, вы недостаточно нормализовались или, возможно, не поняли отношения между элементами данных.