3

複数の「集合」演算子を持つ既存のクエリで何が起こっているのかを理解しようとしています。私が試したさまざまなWeb検索では、何も明らかになりませんでした。また、Teradataのドキュメントを簡単に確認することもできませんでした。

これが私が見ているクエリの擬似コード表現です:

SELECT column from table1
UNION
SELECT column from table2
UNION
SELECT column from table3
MINUS 
   (select column from table 4)
UNION
SELECT column from table4

私は主にがどのようにMINUS処理されるかに興味があります。table3の直前のSELECTからのみ行を減算しますか、それとも結合された結果セットから減算しますか?また、式の括弧は、MINUS私が見ているコードに含まれていることに注意してください。

また、ラストUNIONは全く操作の対象ではないと思いMINUSます。

いくつかのサンプルテーブルを作成することでこれを自分で理解できると確信していますが、現在データベースにアクセスできません(今日、自宅からいくつかの作業を実行しようとしています)。

参考:TeradataMINUSはANSIと同じEXCEPTです。

4

4 に答える 4

6

オラクル http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries004.htm

セット演算子 UNION、UNION ALL、INTERSECT、および MINUS を使用して、複数のクエリを組み合わせることができます。すべての集合演算子の優先順位は同じです。SQL文に複数の集合演算子が含まれる場合、括弧で別の順序を明示的に指定しないかぎり、Oracle Databaseはそれらを左から右に評価します。

http://www.postgresql.org/docs/current/static/sql-select.html#SQL-EXCEPT

同じ SELECT ステートメント内の複数の EXCEPT 演算子は、括弧で特に指定しない限り、左から右に評価されます。EXCEPT は、UNION と同じレベルでバインドします。

ただし、postgresql では

http://www.postgresql.org/docs/current/static/sql-select.html#SQL-INTERSECT

同じ SELECT ステートメント内の複数の INTERSECT 演算子は、括弧で特に指定しない限り、左から右に評価されます。 INTERSECT は UNION よりも強く結合します。つまり、A UNION B INTERSECT C は、A UNION (B INTERSECT C) として読み取られます。

強調は、引用のいずれかで、私自身のことでした..

したがって、それは実装に依存します。

于 2013-02-04T20:20:20.127 に答える
2

Oracle がこの sqlfiddleMINUSでそれを処理する方法を確認できます。これは、その時点までに集計されたセット全体に適用されます。他のDBも同様に機能し、EXCEPT(OracleとTeradataが呼び出すMINUS) ANSI標準演算子であるため、Teradataも同じように動作する可能性があります。

于 2013-02-04T20:08:12.170 に答える
2

JayC の回答から、検索方法の手がかりが得られ、適切な Teradata リファレンスを見つけることができました。将来の読者のためにこれを追加します。Chapter 6, SQL Functions, Operators, Expressions, and Predicates から:

The precedence for processing set operators is as follows:
1 INTERSECT
2 UNION and MINUS/EXCEPT
The set operators evaluate from left to right if no parentheses explicitly specify another order.

私の状況に似た例さえあります。 ここにpdfをダウンロードするためのリンクがあります。

于 2013-02-04T21:37:00.403 に答える
0

ほとんどのデータベースは上から下に進み、途中でセットを構築していると思います。ただし、理想的には、必要な優先順位を反映するようにコードを記述する必要があります。たとえば、

(((
SELECT column from table1
UNION
SELECT column from table2
) a
UNION
SELECT column from table3
) b
MINUS 
   (select column from table 4)
) c
UNION
SELECT column from table4 
于 2013-02-04T20:01:09.397 に答える