0

2 つのテーブル:

prefix ( id, value )
---------------------
1  'hello'
2  'good afternoon'
3  'good night'


suffix ( id, value )
---------------------
1  'world'
3  'world'

経由でテーブルに結合できるテーブルからすべてを取得したい prefixsuffixid

結果は次のようになります。

prefix.id  prefix.value   
--------------------------
1          'hello'        
3          'good night'   

まあ-これまでのところ非常に簡単です...しかし、テーブルの接尾辞が空の場合、サブセレクト/ ctesを使用prefix せずif....に、または両方の条件を満たす1つのクエリでテーブルからすべてを取得したいと思います! 魔法のhaving-clauseまたはトリッキーな何かでこれを行うためのトリックはありますか?

テストケースのみ: SQL-fiddle

4

3 に答える 3

3

まあ、方法ありますが、あなたの要件が(実際的な)意味をなさないという他の人に同意します。

とにかく、ここに行きます:

  1. テーブルを 2 回結合しsuffixます (毎回左結合で)。1 つの結合はid列にあり、もう 1 つは常に true 条件にあります。

  2. prefix出力に必要な列と、 の最初のインスタンスの少なくとも 1 つの null 非許容列で結果をグループ化しますsuffix

  3. HAVING 句で、最初のsuffix列が NULL でない、または 2 番目のsuffixインスタンスの NULL 不可の列の値の数が 0 であるという条件を設定します (明らかに、すべてのグループの行数は同じになります。つまり、カウントはすべてのprefix行で同じです。)

これはクエリです:

SELECT prefix.id, prefix.value
FROM prefix
LEFT JOIN suffix ON prefix.id = suffix.id
LEFT JOIN suffix AS test ON 1=1
GROUP BY prefix.id, prefix.value, suffix.id
HAVING suffix.id IS NOT NULL OR COUNT(test.id) = 0;

SQL Fiddle にもデモがあります。

于 2013-07-23T17:26:22.770 に答える
2

ORとが必要ですNOT EXISTS:

SELECT 
   prefix.id, prefix.value
FROM
   prefix 
WHERE 
   EXISTS(SELECT 1 from suffix WHERE prefix.id=suffix.id)
   OR NOT EXISTS(SELECT 1 FROM suffix)

デモ

于 2013-07-23T13:57:12.903 に答える
0

答えは次のとおりだと思います。いいえ、できません。

または、できる場合: いいえ、すべきではありません。

于 2013-07-23T14:33:53.650 に答える