3

課題の質問がありました:

Find the celebs that have been in relationship with the same celeb. 
The result should be (celeb1, celeb2, celeb3) triples, 
meaning that celeb1 and celeb2 have been in relationship with celeb3.

これで、テーブル「Relationships」にceleb1フィールドとceleb2フィールドがあります。値はVARCHARです。

この問題に対する私の解決策は次のとおりです。

  CREATE VIEW Celeb1Rels AS
SELECT celeb1 AS c1, celeb2 AS c2 FROM relationships;

CREATE VIEW Celeb2Rels AS
SELECT celeb1 AS c2, celeb2 AS c3 FROM relationships;

SELECT * FROM Celeb1Rels NATURAL JOIN Celeb2Rels;

そしてそれはうまくいきます。しかし、インストラクターは彼の解決策を投稿し、彼は持っていました:

SELECT X.celeb1, Y.celeb1, X.celeb2
FROM Relationships X, Relationships Y
WHERE X.celeb2=Y.celeb2 AND X.celeb1<Y.celeb1;

彼がX.celeb1<Y.celeb1を使用している理由がわかりません。これは機能し、正しい出力を提供しますが、数値の比較に「<」が使用されていると思いましたか?

この場合、「<」が何をしているのか誰かが説明できますか?VARCHARSを比較するときの動作は?

4

3 に答える 3

3

関係が重複しないようにするためです。たとえば、celeb1 と celeb2 の間、および celeb1 と celeb3 の間の 2 つの架空の関係を考えてみましょう。結果が必要です。

celeb2, celeb3, celeb1

テーブルが同じリレーションシップで結合しないようにするには、2 番目の不等式演算子が必要です (つまり、celeb1 と Celeb2 が結合して celeb1 と celeb2 に戻る)。インストラクターのクエリを使用して修正すると、<not equals を使用する代わりに<>、次の結果が得られます。

celeb2, celeb3, celeb1
celeb3, celeb2, celeb1

しかし、これらの行は同じことを示していますが、順序が異なります。>不等式演算子は、2 番目の列が常に 1 番目の列の後のアルファベット順の名前であることを保証するだけです。

>したがって、varchars に適用されたときに演算子を要約すると、アルファベット順に機能するため'a' < 'b''abc' > 'aaa'などです。

于 2013-02-13T13:20:35.833 に答える
2

たとえば、2倍のレコードを除外すると思います。

この表にある場合(A,B)(B,C)クエリがない場合は次のようAND X.celeb1<Y.celeb1になります。

(A,B,C)(B,C,A)出力で。この条件を追加する(A,B,C)と、すぐに1つのレコードのみが出力されA < Cます。

于 2013-02-13T13:20:13.593 に答える
1

インストラクターのソリューションは、CELEB2が2つの関係にあるトリプルを生成します。WHERE句のこの部分...

X.celeb1<Y.celeb1

... 3つの異なる有名人の行のみを取得し(つまり、同じレコードをそれ自体と照合することを回避し)、3Pごとに1つの行のみを取得するようにします。

思ったとおりに機能するよりも、アルファベット順に並べ替えられます。そう'ANDY GARCIA' < 'ANDY KAUFMAN'です。

注意事項:

  • ASCII値を使用するため、大文字と小文字が区別されます。これ'andy garcia' < 'ANDY KAUFMAN'は誤りです。
  • 数字もアルファベット順にソートされるので、'11' < '2'本当です。

「この並べ替えの問題についてはわかりませんでした」

NLS_SORTパラメータを設定することにより、Oracleのソートケースを無意識に作成することができます。ただし、これによって比較が変わることはありません。そのためには、NLS_COMPパラメータをに変更する必要がありますLINGUISTIC。大文字と小文字を区別する並べ替えに依存する可能性のあるコードが多すぎるという理由だけで、これらはデフォルトの動作ではありません。 詳細をご覧ください

于 2013-02-13T13:19:27.210 に答える