0

単一の行を返す必要があるクエリで結合する必要がある 2 つのテーブルがあります。1 つのテーブルから、常に存在する行を選択します。2 番目から 2 つの行を選択する必要があります。そのうちの 1 つは常に存在し、もう 1 つは時々しか存在しません。

2 番目のテーブルの両方の行が存在する場合はこれを機能させることができますが、2 番目の行が存在しない場合は機能しません。

これが私のスキーマの簡単な例です

表 1: 会社

COMPANY_ID int

------------
|COMPANY_ID|
------------
|         1|
|         2|
------------

表 2: 設定

COMPANY_ID int,
PREFERENCE_ID int,
PREFERENCE_VALUE varchar

-------------------------------------------
|COMPANY_ID|PREFERENCE_ID|PREFERENCE_VALUE|
-------------------------------------------
|         1|            1|             foo|
|         1|            2|             bar|
|         2|            1|             baz|
-------------------------------------------

私が探しているのは、COMPANY_ID = 1 の場合は両方の PREFERENCE_ID を持つ行を返し、COMPANY_ID = 2 の場合は 1 つの PREFERENCE_ID と空のセル (またはゼロまたは任意のデフォルト値) を持つ行を返すクエリです。

次のようなクエリを使用しようとしています

select c.*, p1.PREFERENCE_VALUE as VALUE1, p2.PREFERENCE_VALUE as VALUE2 
  from 
    COMPANIES 
    join PREFERENCES p1 on c.ID = p1.COMPANY_ID 
    join PREFERENCES p2 on c.ID = p2.COMPANY_ID 
   where 
     p1.PREFERENCE_ID = 1 and 
     p2.PREFERENCE_ID = 2 and 
     COMPANIES.ID = 1;

COMPANY_ID = 1 (PREFERENCE_ID 12 がある場合) でこのクエリを実行すると、正常に動作します。COMPANY_ID = 2 で実行すると、空のセットが返されます。2 番目の結合に左結合を使用しようとしましたが、それは機能しません何も変えません。

返してほしいもの:

COMPANY_ID = クエリの 1:

------------------
|ID|VALUE1|VALUE2|
------------------
| 1|   foo|   bar|
------------------

COMPANY_ID=2 の場合、VALUE2 に対しては何でも返すことができます。null、空白、0、気にしない:

------------------
|ID|VALUE1|VALUE2|
------------------
| 2|   baz|      |
------------------

TIA にアドバイスを求める。

4

1 に答える 1

2

問題はWHERE節です。LEFT JOINnull を返し、探しているものを正確に生成しWHEREますが、クエリの はそれを否定します。

select c.*, p1.PREFERENCE_VALUE as VALUE1, p2.PREFERENCE_VALUE as VALUE2 
  from 
    COMPANIES 
    inner join PREFERENCES p1 
      on c.ID = p1.COMPANY_ID and p1.PREFERENCE_VALUE = 1
    left outer join PREFERENCES p2 
      on c.ID = p2.COMPANY_ID and p2.PREFERENCE_VALUE = 2
   where 
     COMPANIES.ID = 1;
于 2013-04-02T18:55:47.510 に答える