2

同じ列名を持つ 2 つのビュー A と B がありますStudentID, FeeToBePaid, AmountPaid。どちらのビューStudentIDでも同じです。しかし、列FeeToBePaidAmountPaidは異なります。

B の行を A の行if A.FeeToBePaid <= A.AmountPaidと同じstudentID.

ビューA

SchoolStudentID     sFeeToBePaid     amountpaid
12-S-3003             1000.00         1000.00   

ビューB

SchoolStudentID   sFeeToBePaid   amountpaid
  12-S-3003         1000.00        0.00 
  11-F-2019         NULL           1000.00
  12-S-3009         NULL           1000.00

私は答えが必要です

SchoolStudentID sFeeToBePaid amountpaid

  12-S-3003         1000.00        1000.00
  11-F-2019         NULL           1000.00
  12-S-3009         NULL           1000.00
4

2 に答える 2

2

ALLなしでLEFT JOIN使用した2つの結果を組み合わせて、重複レコードを排除してみてください。UNION

SELECT a.SchoolStudentID , 
       CASE WHEN a.sFeeToBePaid  <= a.amountpaid 
            THEN a.sFeeToBePaid 
            ELSE b. sFeeToBePaid 
       END AS sFeeToBePaid,
       CASE WHEN a.sFeeToBePaid  <= a.amountpaid 
            THEN a.amountpaid
            ELSE b.amountpaid 
       END AS amountpaid 
FROM   ViewA a
       LEFT JOIN ViewB b
        ON a.SchoolStudentID  = b.SchoolStudentID 
UNION
SELECT a.SchoolStudentID , 
       CASE WHEN b.sFeeToBePaid  <= b.amountpaid 
            THEN b.sFeeToBePaid 
            ELSE a. sFeeToBePaid 
       END AS sFeeToBePaid,
       CASE WHEN b.sFeeToBePaid  <= b.amountpaid 
            THEN b.amountpaid
            ELSE a.amountpaid 
       END AS amountpaid 
FROM   ViewB a
       LEFT JOIN ViewA b
        ON a.SchoolStudentID  = b.SchoolStudentID 

SQLFiddleデモ

于 2012-09-27T08:05:42.757 に答える
1

編集

考慮するUNION必要はありません。以下で十分です。

SELECT
            B.SchoolStudentID
          , CASE WHEN(A.sFeeToBePaid <= A.amountpaid)
                THEN A.sFeeToBePaid
                ELSE B.sFeeToBePaid
            END sFeeToBePaid
          , CASE WHEN(A.sFeeToBePaid <= A.amountpaid)
                THEN A.amountpaid
                ELSE B.amountpaid
            END amountpaid                               
    FROM
          B
        LEFT JOIN
          A ON A.SchoolStudentID = B.SchoolStudentID

SQL フィドルのデモ

これは、条件が満たされた場合にB値を値に置き換えるだけです。A


EDIT2

追加する

    ORDER BY
              sFeeToBePaid DESC
            , SchoolStudentID

この特定のケースで必要な順序が得られます。ただし、これは賢明ではないようです。B順序の一貫性を保つために、行の望ましい順序を知る必要があります。

noORDER BYが指定されている場合、クエリ エンジンは、適切と思われる順序でリクエストを処理することに注意してください。これは多くの場合、呼び出し間で一貫している可能性がありますが、これは単なる偶然です。サーバーに複数のプロセッサがあり、複数のプロセッサを使用することでクエリのパフォーマンスが向上する場合、頻繁に変化することに気付くでしょう。つまり、クエリ プランに並列化が含まれる場合です。

于 2012-09-27T08:04:12.007 に答える