web-dev-qa-db-ja.com

UNION ALL with / MINUS

どして:

select 1 FROM DUAL 
UNION ALL
select 1 FROM DUAL
MINUS
SELECT 2 FROM DUAL

oracleでは2行の1ではなく、1つの1のみを返しますか?

3
Kevin Meredith

Oracleでは、現在すべての設定演算子 優先順位は同じ であり、上から下に評価されます。

SELECT 1
FROM   DUAL
UNION ALL
SELECT 1
FROM   DUAL;

両方の列に1が含まれる2つの行を返します。

ただし、minusunionと同様に動作し(union allではなく)、重複を削除するため、distinct-結果を確定します。

必要な結果を取得する1つの方法は、(1)Union allの結果に(1) MINUS (2)-されるように括弧を追加することです。

SELECT 1
FROM   DUAL
UNION ALL
(SELECT 1
 FROM   DUAL
 MINUS
 SELECT 2
 FROM   DUAL);
6
Martin Smith

マーティン・スミスは、マイナスする前に結合する必要がない場合に考えられる解決策に取り組みました(これは、意図したとおりに機能するかどうかはわかりません)。重複する行を保持しながら、UNIONの前に最初にMINUSする必要がある場合。私はあなたがこれらの線に沿って何かをしなければならないと思います:

SELECT
  *
FROM (
  SELECT 1 as col1 FROM DUAL
  UNION ALL
  SELECT 1 as col1 FROM DUAL) UN
WHERE NOT EXISTS (SELECT 2 as col1 FROM DUAL MI WHERE UN.col1 = MI.col1)

基本的にUNION ALL次に、結果を(WHERE句を介して)フィルタリングして、MINUSデータセットに存在するものを除外します。

1
Joishi Bodio