単純なSQLコードは私を回避します。2つの不一致テーブルを統合します

StackOverflow https://stackoverflow.com/questions/342044

  •  19-08-2019
  •  | 
  •  

質問

1つのテーブルから1つのフィールドを選択し、一時テーブルに保存しています。

そのテーブルの行が0行になることがあります。

そのフィールドを20以上のフィールドがある別のテーブルに追加したい

フィールド番号が一致しないため、通常のユニオンは機能しません。 比較するものが何もないので、外側は私にとってはうまくいきません。 NVLは最初の一時テーブルでは機能しません。

誰もがそれを行う方法を知っていますか?

更新:

言及できませんでした... 1つのフィールドを取得するテーブルが他の場合に一致を見つけると、私が使用しているこのコードは機能します。

SELECT DISTINCT reqhead_rec.resp_name<br>
FROM reqhead_rec, biglist<br>
WHERE reqhead_rec.req_no = biglist.req_no
 AND reqhead_rec.frm = biglist.req_frm<br>
INTO TEMP grabname with no log;

SELECT biglist.*, grabname.resp_name<br>
FROM biglist, grabname<br>
ORDER BY prnt_item, account_amt<br>
INTO TEMP xxx with no log;
役に立ちましたか?

解決

どのフィールドと一致しますか?ところで、ここにそれらを並べる方法があります:

SELECT NULL, NULL, NULL, NULL, MySingleField, NULL, NULL, NULL... FROM #temp
UNION ALL
SELECT Col1, Col2, Col3, Col4, Col5, Col6,... FROM OtherTable

更新:

OK、更新を読んだ後... UNIONが欲しいとは思わないが、信じられないほどシンプルなSUBSELECT

SELECT
    *,
    (SELECT TOP 1 Name FROM Blah WHERE Blah.SomeID = MyTable.SomeID) AS ExtraCol
FROM
    MyTable

他のヒント

結合ではなく、結合が必要なようです。

結合を行うために何も比較する必要はありません。結合条件を指定しないと、最終的に外積になります。

SELECT t20.*, t1.*
FROM table_with_20_columns AS t20
  LEFT OUTER JOIN temp_table_with_1_column AS t1 ON (1=1);

一時テーブルに行がない場合、上記のクエリの結果でNULLとして報告されます。

ただし、一時テーブルに複数の行がある場合は、最初のテーブルで外積を取得します。あなたの質問から何が欲しいのかわかりません。

edit: ONまたはUSING句で表される結合条件は、SQL標準に従ってオプションである必要がありますが、少なくともMySQL 5.0でテストすると、構文エラーになります。その節を省略します。ただし、ON (1=1)を使用できます。

編集:コメントで質問に答える:

SELECT COALESCE(reqhead_rec.resp_name, dflt.resp_name) AS resp_name
FROM (SELECT 'default name' AS resp_name) dflt
  LEFT OUTER JOIN reqhead_rec ON (1=1)
WHERE reqhead_rec.req_no = biglist.req_no AND reqhead_rec.frm = biglist.req_frm 
INTO TEMP grabname WITH NO LOG;

実際には、一時テーブルを完全にスキップできる場合があります。メインテーブルを左にreahead_recするだけです。これらの条件は、WHERE句ではなく、結合のCOALESCE()句に入れます。次に、そのクエリの選択リストで<=>を使用して、他のテーブルに見つからない場合のデフォルト名を指定します。

SELECT b.*, COALESCE(r.resp_name, 'default name') AS resp_name
FROM biglist AS b
  LEFT OUTER JOIN reqhead_rec AS r
    ON (b.req_no = r.req_no AND r.frm = b.req_frm)
INTO TEMP xxx WITH NO LOG;

欠損値に対してnvl(NULL,NULL)を選択してみてください

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top