我试图编写一个组合来自两个表的数据的查询。两个表都包含有关某些对象的信息。对象由三元组(x,y,z)(每个x,y和z在T1中具有单独的列)以及其名称(T1中的主键)唯一地定义。在T2中,主键是name2。还有一个列名1表示对象名2链接到的对象,列w。所以T1包含了对象'名称及其三元组,而T2告诉我们哪些对象是链接的('链接'不是等价,如果object1链接到object2,则object2没有链接到对象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再到T1再回到T1。
答案 0 :(得分: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中。如果B和C链接到A,则T2将是(尤其)
Name2 Name1
B A
C A
我们给出了x,y和t,并希望对象的三元组链接到第一个坐标上带有x和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是否引用linked_from或linked_to对象。这对于查询的输出非常重要,但是在SQL中进行更改是微不足道的 - 只需使用其他别名 - 所以我假设它是父对象。 where子句是
where link_from.x = @x_given_value
and link_from.y = @y_given_value
and linkage.w > @t_given_value
您不需要在SELECT子句中添加其他子查询,因为您已经在FROM cluase中引用了所需的所有表和表角色。所以它变成
SELECT
link_to.x,
link_to.y as k,
linkage.w
我确信你可以完成订购。
请注意数据库中涉及的基数,即每个条件匹配的行数。您声明x,y和z一起是唯一的。由于只提供了x和y,因此可能会返回多行。类似地,即使对于相同的name1,name2值,也可能有许多行的值大于t的给定值。 T2中的每一行都有很多行。
我意识到这是一个例子,你可能已经简化了#34;问题的名称,但是当你发现自己用数字后缀命名列时,你就会做错事。也许你还没有充分规范化,或者你可能还没有理解数据项之间的关系。