0

次のようなテーブル1があります

ID1    ID2         Name                     Balance
10232   22      Building America            7000
10233   22     Long term                   3400
10234   25         Capital                  2300

表 2 は次のとおりです。

ID1    note     Balance
10233    2         5000
10234   1        3500

コードは最初にテーブルをテーブル 1 に移動し、ID1 がテーブル 2 に存在するかどうかを確認する必要があります。存在しない場合は、[テーブル 1 による残高] を選択します。表 1 から残高を増やし、表 2 の注記が 1 より大きいことがわかった場合、ID1 に複数の ID2 があるかどうかを確認し、複数の ID2 がある場合は、同じではない他の ID1 があるかどうかを確認し、次に、表 2 の残高と、表 1 で見つかった他の ID を追加します。したがって、ID1 = 10233 の場合、コードは表 2 に移動し、ノートが 2 であることがわかります。10233 の対応する ID2 は 22 です。同じ ID2 を含む ID1 があります。同じ ID2 を持つ 2 つの ID1 は 10232 と 10233 です。次に、表 2 から 10233 の残高を追加し、次に表 1 から 10232 の残高を追加します。

ID 10234 の場合、note が 1 であることがわかり、テーブル 1 からのみ取得するため、2300 です。

これに関連するロジックの構築に多くの問題があり、一連のケースステートメントで立ち往生しています。どんな種類の助けもいただければ幸いです。

4

2 に答える 2

1

ロジックがこのように複雑になると、データベースの設計がうまくいかない可能性があり、リファクタリングを検討する必要があるという危険信号です。それにもかかわらず、このFiddleは機能しているように見えるクエリを示しています。

編集: あなたの説明では、「ビルディング アメリカ」を除外すべきかどうかが明確ではありませんでした。もしそうなら、代わりにこのフィドルを見てください。

于 2013-07-19T20:17:05.980 に答える
0

はじめに: 左結合を行います:

SELECT <...>
FROM dbo.table1 t1
LEFT OUTER JOIN dbo.table2 t2
ON t1.ID1 = t2.ID2

その後、1 つの case ステートメントで 2 つのテーブルのすべての列にアクセスできます。table2 に適切な行が存在しない場合、それらの列は NULL に設定されます。

ここで見つけることができるさまざまな結合の詳細: http://sqlity.net/en/1146/a-join-a-day-introduction/

于 2013-07-20T08:08:16.537 に答える