SQL:找到父母和我一样的所有孩子

时间:2012-10-02 10:39:00

标签: sql subquery

假设我想找出父母和我父母在同一个班级的所有孩子。我可以写这样的查询:

SELECT child.* FROM child
 JOIN parent ON child.ParentID = parent.ID
   WHERE parent.class IN (SELECT parent1.class 
     FROM parent1 JOIN child1
       ON parent1.id = child1.parentID
    WHERE child1.ID = MyID)

不知怎的,这感觉我做错了,因为我写了(大约)相同的连接两次,但我无法找到一种方法来改进它(我可以找出其他方法来嵌套子查询,但没有一个看起来更整洁。)

有没有一种干净的方法可以让我失踪?或者我这样做了吗?

编辑:正如GolzeTrol在他对这个问题的答案(完整)中指出的那样,将孩子限制为只有一个父母是奇怪的。他是完全正确的,我不是打算在实际的家庭上运行这个查询,而是在其他一些表上,每个孩子实际上只与一个父母相关联。

3 个答案:

答案 0 :(得分:2)

加入他们吧。你必须两次加入两个表,以获得相关的父母,然后是他们的孩子,但除此之外,这是一个简单的内部联接。我添加了别名(在这种情况下你必须反正),以明确每个表的'角色'是什么。

select
  otherkids.*
from
  child me
  /* Join below is weird. I got only 1 parent... */
  inner join parent myparents on myparents.ID = me.ParentID
  inner join parent otherparents on otherparents.class = myparents.class
  inner join child otherkids on otherkids.ParentID = otherparents.ID
where
  me.ID = :MyID and
  otherkids.ID <> me.ID /* Exclude myself */

我必须说,我认为一个孩子有一个ParentID是奇怪的,而我认为一个孩子有一个母亲和一个父亲,或者至少有两个父母。

家谱计划经常把孩子放在一个家庭中。所以一个家庭有配偶和孩子。这样,即使您不了解父母(或只知道一个孩子),您也可以联系孩子,如果他们离婚并重新结婚,您可以轻松地将人们与多个家庭联系起来。也可能是你的表格结构的建议。

答案 1 :(得分:2)

我同意@ GolezTrol的解决方案,但您仍然可以按照自己的方式解决问题。要使查询按照您的编写方式工作,您应该从返回的子项中添加一个不包括您自己的外部WHERE子句(根据@GolezTroi解决方案)。

此外,虽然它对执行没有任何影响,但是使用'='而不是'IN'样式子查询在语义上更正确,因为您只希望子查询返回一条记录(即你父母所在的一个班级:

SELECT child.* FROM child
 JOIN parent ON child.ParentID = parent.ID
   WHERE parent.class = (SELECT parent1.class 
     FROM parent1 JOIN child1
       ON parent1.id = child1.parentID
    WHERE child1.ID = MyID)
   AND child.ID != MYID

当然,您仍然存在使用相关子查询的问题(即您已将子查询加入到外部查询中),这些问题往往需要比其他方法更长的处理时间。至于你关于两次进行相同连接的观点,SQL经常强迫你在更复杂的查询中执行此操作,尤其是那些将记录与同一表中的其他记录相关联的查询。

答案 2 :(得分:-1)

也许这可以解决您的问题

SELECT child。* FROM child INNER JOIN parent ON child.ParentID = parent.ID INNER JOIN parent2 ON parent.class = parent2.class INNER JOIN child2 ON child2.ParentID = parent.ID WHERE child.ID = myID和child2.ID&lt;&gt;本身份识别码

好吧,试试这个:)