2017-10-28 16 views
0

以下は、結合を使用してレコードが返されない場合の戻りNULL値のSQL問合せです。結合を使用してレコードが見つからない場合はNULL値を返します。

マイクエリ:

SELECT 
    ISNULL((SELECT SR_No 
      FROM Product 
      WHERE SR_No in ('8877','9911')), NULL) 

は基本的に私はSR_NoProductテーブルで利用可能であるかどうかを確認する必要があります。

私は以下のような出力を得るために、私のスクリプトを変更するにはどうすればよい

表 - > Item_M:

+-------+---------+ 
| SR_No | Asso_Id | 
+-------+---------+ 
| 4455 |  100 | 
| 4455 |  200 | 
| 4455 |  300 | 
| 8877 |  500 | 
| 9911 |  600 | 
+-------+---------+ 

卓上>製品:

| SR_No | Pro_N | Pro_Sc | 
+-------+-------+--------+ 
| 4455 | SA | S  | 
| 8877 | BT | B  | 
|  | 
+-------+-------+--------+ 

の予想される出力を:

+-------+-------+--------+ 
| SR_No | Pro_N | Pro_Sc | 
+-------+-------+--------+ 
| 8877 | BT | B  | 
| NULL | NULL | NULL | 
+-------+-------+--------+ 
+4

私は結果の背後にある論理を理解していません。なぜヌルの行があるはずですか?参加はどこですか? –

+0

@SamKuhmonen:どうすればここに参加することができますか、基本的に私はProduct Tableで利用可能な "SR_No"をチェックする必要があります –

+1

私はまだそれを取得しません - 8877と9911の両方にProductと 'Item_M'テーブルの行があります。また、あなたが 'WHERE'に10個の製品をリストし、誰も '修飾していない'場合は、10行のNULLが必要ですか、少なくとも' SR_No 'をリストしたいですか? 私は思っています*これはあなたの後です - http://sqlfiddle.com/#!6/51f2c/2 – StuartLC

答えて

2

これはTable Valued Constructorを使用して、探しているアイテムのテーブルを作成してから、商品(および場合によってはアイテム)テーブルをLEFT JOINにするのに適しているように見えます。列、またはNULLは、適格基準が満たされていない場合:

-- If you want the SR_No number listed along with NULLs 
SELECT x.SR_No, p.Pro_N, p.Pro_Sc 
FROM (values (8877),(1234)) as x(SR_No) 
LEFT OUTER JOIN Product p 
on x.SR_No = p.SR_No; 

出力:

SR_No Pro_N Pro_Sc 
8877 BT  B 
1234 (null) (null) 

そして、あなたはヌルと一緒SR_No値を表示したくない場合3210

-- If you want the SR_No listed as NULL instead 
SELECT p.SR_No, p.Pro_N, p.Pro_Sc 
FROM (values (8877),(1234)) as x(SR_No) 
LEFT OUTER JOIN Product p 
on x.SR_No = p.SR_No; 

与える:

SR_No Pro_N Pro_Sc 
8877 BT  B 
(null) (null) (null) 

第二のアプローチの問題点は、あなたのコードに便利になることはほとんどありません複数の非マッチがある場合は、NULL列の複数の行を示すことだろうということですこのクエリを消費します。あなたは、クエリを調整し、さらに、同様の製品のための、本項目の行がなければならないことを修飾する必要がある場合は

LEFT OUTER JOIN Product p 
on x.SR_No = p.SR_No AND EXISTS (SELECT 1 FROM Item_M i WHERE i.SR_No = p.SR_No); 

SqlFiddle here

0

はこれを試してみてください:

SELECT CASE WHEN SR_No IN ('8877','9911') THEN SR_No END AS SR_No, 
     CASE WHEN SR_No IN ('8877','9911') THEN Pro_N END AS Pro_N, 
     CASE WHEN SR_No IN ('8877','9911') THEN Pro_Sc END AS Pro_Sc 
FROM Product 

SQL Fiddle

あなたはそれを変更することができます('8877','9911')の代わりにサブクエリを使用します。

関連する問題