1

申し訳ありませんが、問題のヘルプを見つけるためにどのキーワードを使用すればよいかわかりません。

独自のフィルター機能を持つ他のソフトウェアで使用する SQL のビューを構築しています。ビューをいくつかの目的で使用したいので、ある種の非正統的なアイデアがあります。

もともと、2 つのテーブルを LEFT OUTER JOIN したかったのです。しかし: SQL が一致を見つけたとしても、Right テーブルからのデータを持たない余分なレコードが必要です。次に例を示します。

t1:

pk   data
1    a
2    b
3    c

t2:

pk  fk  data
1    a   line1
2    a   line2
3    c   line3
4    c   line4
5    c   line5

ここに私が現在得ているものがあります: クエリ:

select t1.data, t2.data from t1 left outer join t2 on t1.data = t2.fk

戻る:

t1.data  t2.data
a        line1
a        line2
b        <NULL>
c        line3
c        line4
c        line5

私が実際に返したいもの:

t1.data  t2.data
a        <NULL>
a        line1
a        line2
b        <NULL>
c        <NULL>
c        line3
c        line4
c        line5

この結果が必要な理由は、他のソフトウェアでビューを使用して、t2.data = NULL のレコードのみをフィルタリングできるためです。

誰も私がこれを行う方法を知っていますか? ソフトウェアに手動で参加したくありません。そのパフォーマンスは、エンドユーザーにとって耐えられないほど非効率的だからです。

あなたの助けに感謝します。

PS右のテーブルを、一致しないトップ(1)選択を完全に外部結合するサブセレクトに置き換えることを考えましたが、それを適切に行う方法がわかりません:-/

4

1 に答える 1

2

あなたの答えは次のとおりINNER JOINです。NULL のレコードを取得しないように an を使用し、t1 で UNION を使用して NULL t2.data 列を強制します。

SELECT t1.data, t2.data
FROM t1
INNER JOIN t2 ON t1.data = t2.fk
UNION ALL
SELECT t1.data, NULL
FROM t1

これにより、必要な結果セットが得られるはずです。

于 2013-02-21T13:58:51.750 に答える