2016-07-04 8 views
0

同じカラムを持つ2つのテーブルがあります。この2つのテーブルを選択する必要があります。これを行う最良の方法は何ですか?私の選択テストは同じ列を持つ2つのテーブルからselectを実行する

です。
SELECT  
    ISNULL(LoteDet.IdLoteDet, LoteDetPg.IdLoteDet) AS Expr1, 
    ISNULL(LoteDet.IDSac, LoteDetPg.IDSac) AS Expr2, 
    ISNULL(LoteDet.Comprom, LoteDetPg.Comprom) AS Expr3, 
    ISNULL(LoteDet.NossoNum, LoteDetPg.NossoNum) AS Expr4, 
    ISNULL(LoteDet.NossoNumDig, LoteDetPg.NossoNumDig) AS Expr5 
FROM 
    LoteDet 
CROSS JOIN 
    LoteDetPg 
WHERE 
    Expr1 = 500 

これは可能ですか?

方法を選択し、この種のを実行するためのより良い方法である一つのテーブルに値を見つからない場合は、値が他のテーブルになります....

------ EDIT

おそらくビューを作成すると、このタイプの選択肢に代わる良い選択肢になりますか?

+2

デカルト積が必要ですか? –

+1

期待した結果を表示できますか? –

答えて

0

使用COALESCE:

SELECT  
    COALESCE(LoteDet.IdLoteDet, LoteDetPg.IdLoteDet) AS Expr1, 
    COALESCE(LoteDet.IDSac, LoteDetPg.IDSac) AS Expr2, 
    COALESCE(LoteDet.Comprom, LoteDetPg.Comprom) AS Expr3, 
    COALESCE(LoteDet.NossoNum, LoteDetPg.NossoNum) AS Expr4, 
    COALESCE(LoteDet.NossoNumDig, LoteDetPg.NossoNumDig) AS Expr5 
FROM 
    LoteDet 
CROSS JOIN 
    LoteDetPg 
WHERE 
    Expr1 = 500 

このマニュアルのを見てみましょう:https://msdn.microsoft.com/pt-br/library/ms190349.aspx

0

私は、これはデカルト積と呼ばれる何を返すために起こっていると考えています。上記のように、オープンジョインの結果です。このクエリは、2つのテーブルを結合する方法を指定していないため、レコードのTONSを返すことになります。盲目的に一致する列を試すだけです。最低でも、ID /キーを照合できるように、ON条件をJOINに追加します。私はあなたが欲しいと思うのはINNER JOINです。 ID/Keyに基づいて、一致するすべての行が返されます。

SELECT 
    CASE WHEN tbl1.Comprom IS NULL THEN tbl2.Comprom ELSE tbl1.Comprom END AS Expr1 
    CASE WHEN tbl1.Nossonum IS NULL THEN tbl2.Nossonum ELSE tbl1.Nossonum END AS Expr2 
FROM 
    tbl1 --LoteDet 
    INNER JOIN tbl2 --LoteDetPg 
     ON (tbl1.ID = tbl2.ID) 
WHERE 
    Expr1 = 500 --I know I swapped the expression values, use whichever expression you need here 

今、唯一の一致するIDを持つ行はあなたに値を返し、それがnullでない限り、それはそれはTBL2からの値を使用します、TBL1の値を使用します。

編集: WHOSが指定されている場合、CROSS JOINはINNER JOINに変わりますが、両方のテーブルを含める必要がありますか?私はExpr1 = 500が依然としてデカルト積を生み出すと感じます。誰かが私を修正できますか?

関連する問題