3

UNION で結合された 3 つのサブクエリがあるとします。

select * from (
    select nr, pos, '1' from foo
    union all
    select nr, pos, '2' from bar
    union all
    select nr, pos, '3' from foobar
)

私が必要としているのは、値が最初のサブクエリ (from から) によって返されなかっfoobar た場合にのみから行を返す結果です。nrfoo

nr行全体ではなく、列が唯一の条件である必要があるため、UNION は役に立ちません。私は正しいですか?

申し訳ありませんが、これをより適切に説明する方法がわかりません。

4

4 に答える 4

2

最初の 2 つのクエリに結果がない場合にのみ結果を返すようにするwhereには、最後に句を追加します。以下の更新されたクエリを参照してください。select

select nr, pos, '1' from foo
union all
select nr, pos, '2' from bar
union all
select nr, pos, '3' from foobar fb
 where not exists (select 1 from foo f where fb.nr = f.nr)
   and not exists (select 1 from bar b where fb.nr = b.nr)
于 2012-12-02T15:20:25.260 に答える
1

多分このようなトリック:

select distinct min(x), nr, pos from (
    select nr, pos, '1' as x from foo
    union all
    select nr, pos, '2' from bar
    union all
    select nr, pos, '3' from foobar
)
group by nr, pos
于 2012-12-02T16:07:36.763 に答える
0

あなたが必要なようです:

SELECT *
  FROM (SELECT nr, pos, '1' AS code FROM foo
        UNION ALL
        SELECT nr, pos, '2' AS code FROM bar
        UNION ALL
        SELECT nr, pos, '3' AS code
          FROM foobar
         WHERE nr NOT IN (SELECT nr FROM foo)
       )

barのアイテムが にリストされていない限り選択されないfooように、また のアイテムがまたは またはfoobarにリストされていない限り選択されないように、その処理を拡張できます。明らかに、数値の列名として(おそらく)以外の名前を選択できますが、名前を指定する必要があります。foobarcodesource

于 2012-12-02T16:05:14.870 に答える
0

使用している SQL 製品でランキング関数がサポートされている場合は、次のことを試すことができます。

SELECT nr, pos, src
FROM (
  SELECT *, RANK() OVER (PARTITION BY nr ORDER BY src) AS rnk
  FROM (
    SELECT nr, pos, '1' AS src FROM foo
    UNION ALL
    SELECT nr, pos, '3' AS src FROM foobar
  ) s
) s
WHERE rnk = 1
UNION ALL
SELECT nr, pos, '2' AS src FROM bar
;

最も内側のサブクエリは、 と からの行を結合foofoobarます。中間層サブクエリはnr、値を提供したソース テーブルに応じて値をランク付けします。

  • からの行は、対応する値が に見つからないかのようにfoobarランク付けされます。1nrfoo

  • それ以外の場合、fooランク付けされるのは行です1

ランク付けされた結果セットはフィルター処理されrnk = 1barテーブルと結合されます (これは無条件に返されると理解しています)。

于 2012-12-02T22:58:31.020 に答える