2017-11-02 2 views
0

クロスジョインから特定のカラムを参照する方法を理解しようとしています。 Cross joinテーブル全体には別名も与えられています。なぜなら、他のサブクエリと自然に結合しているため、カラム名にアクセスするのが難しいからです。SQL/PSQL同じテーブルを相互にクロスジョインした後にwhere句のカラム名を参照する

select q0.sid, q0.sname 
from (buys t1 cross join student s3 cross join student s4) q0 natural join 
    (select s5.sid, s5.sname, s6.sid, s6.sname, t3.sid, t3.bookno                  
     from buys t2 cross join student s5 cross join student s6 cross join buys t3                  
     where t2.sid = s5.sid and t3.bookno = t2.bookno) q1 
where t1.sid = s3.sid; 

問題があることq0.sidがあいまいであるため、t1.sidとs3.sidを比較しようとしているの「」節は: は、ここでは、コードです。クロス結合からこれらの列にアクセスするにはどうすればよいですか?

+0

カラム[別名](https://www.tutorialspot.com/postgresql/postgresql_alias_syntax.htm)を使用してください(例:SELECT s5.sid AS s5_sid、s6.sid AS s6_sid')。 – Serge

+0

これは問題ではありません。私はt1.sidとs3.sidにアクセスすることはできません。最初のクロス・ジョインの中で最後のクラスがどこにあるのか教えてください。 –

+0

'(t1をクロス・ジョイントする学生s3をクロス・ジョイントする学生s4を購入する)'をリファクタリングする必要があります。どのように '(SELECT t1.sid AS t1_sid、s3.sid AS s3_sid、s4.sid AS s4_sid FROM購入t1 CROSS JOIN学生s3 CROSS JOIN学生s4'を購入するのですか? – Serge

答えて

0

私は教授の助けを借りて答えを見つけました。 Withステートメントを使用して、すべての列名の名前を残酷に変更する必要があります。したがって、それは次の行に沿っています:

with e1 as (select t1.sid as t1sid, t1.bookno as t1bookno, 
        s1.sid as s1sid, s1.sname as s1sname, 
        s2.sid as s2sid, s2.sname as s2sname 
      from buys t1 cross join student s1 cross join student s2), 
    e2 as (select t1.sid as t1.sid, etc as etc) 

これは、必要なすべての列の名前を変更するという単なる残酷な方法ですが、機能します。申し訳ありませんが、私がしようとしていることは、SQLの関係代数への直接変換です。助けようとしてくれてありがとうございました!

0

NATURAL joinは、あまり役に立ちませんし、非常にトリッキーな標準SQLの奇妙なものです。私はまったくそれを使用しません。

USING結合条件の句は、基本的なテーブルの列が変更されたり、クエリのリストが編集されたりすると、エラーが発生しやすくなりません。一部のSQLプロフェッショナルは、より明示的なON節よりも簡単に破棄されるため、USING節を妨げてしまいます。私は彼らと一緒ではない。あなたの特定のクエリで

、派生テーブルq0q1は不可能参加NATURALを使用して作る重複する列名、持っている - あいまいな列名ですべてを参照する任意の試みなどを。これは外側のの外側のSELECTリストに含まれています(テーブルstudentq0に2回含まれています)。また、サブクエリq1SELECTリストは目的を果たさず、列はどこにも使用されません。

あなたの質問は複数箇所で壊れていますが、あなたはそれを書き直しています。あなたの質問は、クエリが達成すべきもの、正確なテーブル定義、およびPostgresのバージョンの記述から始めるべきです。

関連する問題