3

両親が私の両親と同じ学校のクラスにいたすべての子供たちを知りたいとしましょう。私はこのようにクエリを書くことができます:

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)

同じ結合を(ほぼ)2回書いているので、どういうわけかこれは間違っているように感じますが、それを改善する方法を見つけることができません(サブクエリをネストする他の方法を見つけることはできますが、どれもそれらのうち、すっきりしているようです)。

私が見逃しているこれを行うためのクリーンな方法はありますか?それとも私はこれを正しくやっていますか?

編集: GolzeTrolがこの質問に対する彼の(完全な)回答で指摘しているように、子供が1人の親しか持たないように制限されるのは奇妙なことです。彼は正確に正しいので、実際の家族に対してこのクエリを実行するつもりはありませんでしたが、他のいくつかのテーブルでは、各子が実際には1人の親にのみ関連付けられています。

4

3 に答える 3

2

それらに参加するだけです。関連する親とその子を取得するには、両方のテーブルを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を持っているのは奇妙だと思いますが、子供には母親と父親、または少なくとも2人の親がいると思います。

系図プログラムはしばしば子供を家族に入れます。したがって、家族には配偶者と子供がいます。そうすれば、両親を知らなくても(または両親を知らなくても)子供をつなぐことができ、離婚して再婚した場合でも、簡単に複数の家族にリンクすることができます。テーブル構造の提案にもなるかもしれません。

于 2012-10-02T10:44:36.497 に答える
2

@GolezTrolの解決策に同意しますが、それでも自分のやり方で解決できます。作成したとおりにクエリを機能させるには、返される子から自分自身を除外する外側のWHERE句を追加する必要があります(@GolezTroiソリューションに従って)。

また、実行に違いはありませんが、サブクエリが1つのレコード(つまり、1つのレコード)を返すことだけを期待しているため、「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

もちろん、相関サブクエリを使用している(つまり、サブクエリを外部クエリに結合している)という問題がまだあり、これらは他の方法よりも処理に時間がかかる傾向があります。同じ結合を2回実行することについてのポイントとして、SQLは、より複雑なクエリ、特にレコードを同じテーブル内の他のレコードに関連付けるクエリでこれを実行するように強制することがよくあります。

于 2012-10-02T10:58:20.807 に答える
-1

多分これはあなたの問題を解決することができます

SELECTchild。*FROMchild 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 and child2.ID < > myID

では、これを試してみてください:)

于 2012-10-02T10:49:01.773 に答える