見つからない場合はSQLクエリはNULLを返す2つのテーブルを結合するために

P00LR0CK:
table: p
p_id/t_id/
1,35
2,35
3,35
4,35
5,35
6,22
7,22
...

テーブルpに対して、P_ID可能なすべての値が登録されています

table: mps
p_id/m_id/value
2,1001,0
4,1001,2
7,1005,1
...

テーブルのために:MPS、P_IDのほんの一部の値が登録されています。

  • どのように我々はできる2つのテーブルを結合し、次の文で?

  • 出力は:しなければならP_ID、M_IDと値。

  • 入力M_ID(例:1001)およびt_id(すなわち:35)。

これは、すべてのP_IDの組み合わせを表示すると、それはテーブルのMPSのデータが見つからない場合は、単に表示nullを持っています。

output example:
p_id, m_id, value
1,1001,null
2,1001,0
3,1001,null
4,1001,2
5,1001,null

私は別のSQLクエリを試してみましたが、私はP_IDがテーブルMPSに登録されていない出力を取得していない午前:

SELECT p.p_id, mps.value, mps.m_id 
FROM p LEFT JOIN
     mps
     ON p.p_id = mps.p_id 
WHERE p.t_id = 35 AND mps.m_id=1001
ニック:

あなたが取得しますので、NULL任意のためのMPS値p_idにされていないがmps、あなたがする必要があるCOALESCEの価値m_idそれはに等しい作るため1001の値のためp_idではありませんでmps

SELECT p.p_id, COALESCE(mps.m_id, 1001) AS m_id, mps.value
FROM p 
LEFT JOIN mps ON p.p_id = mps.p_id AND mps.m_id = 1001
WHERE p.t_id = 35
ORDER BY p.p_id

出力:

p_id    m_id    value
1       1001    (null)
2       1001    0
3       1001    (null)
4       1001    2
5       1001    (null)

SQLFiddleのデモ

代替的に(ように繰り返さない1001値)ことができますCROSS JOINからなる派生テーブルにm_id = 1001、その後LEFT JOINmps

SELECT p.p_id, m.m_id AS m_id, mps.value
FROM p 
CROSS JOIN (SELECT 1001 AS m_id) m
LEFT JOIN mps ON p.p_id = mps.p_id AND mps.m_id = m.m_id
WHERE p.t_id = 35
ORDER BY p.p_id

出力は、前のクエリと同じです。SQLFiddleのデモ

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=25917&siteId=1