2016-11-04 6 views
-6

SQL Server 2008のインスタンスでは、@Configurationというテーブルがあり、3つの列、ID,Code、およびSubCodeがあるとします。 CodeSubCodeの重複行はありません。構成が存在する場合は最初の行を選択し、それ以外の場合はNULLを選択します。Row

ここで、Codeの重複行を持ち、サブコードがNullとしてSubCodeの利用可能な別の詳細レベルテーブル@ConfigurationDetailsを想像してください。 SubCodeが利用可能である

場合、詳細テーブルから直接AmtDataを選び、SubCodeは、詳細テーブルで利用できない場合、その後

(注NULLレコードにAmtDataを選ぶ:SubCode=NULLエントリはすべてのために常に利用可能です設定行)

どこから始めたらよいですか?

あなたが使用することができるはず 簡単な例... テーブル

declare @Configuration TABLE ( 
     ID INTEGER IDENTITY PRIMARY KEY, 
     Code VARCHAR(50), 
     SubCode VARCHAR(50) 


); 

declare @ConfigurationDetails TABLE 
( 
    Code VARCHAR(50), 
    SubCode VARCHAR(50), 
    Amt MONEY, 
    Data VARCHAR(123) 
); 


INSERT INTO @Configuration VALUES 
('BR1','Sub1'), 
('BR1','Sub2'), 
('BR1','Sub3'), 
('BR1','Sub4'), 
('BR2','Sub1'), 
('BR2','Sub2') 

INSERT INTO @ConfigurationDetails VALUES 
('BR1','Sub1',500,'BR1 Sub1 Data'), 
('BR1','Sub2',600,'BR1 Sub2 Data'), 
('BR1',NULL,700,'BR1 Data'), 
('BR2','Sub1',500,'BR2 Sub1 Data'), 
('BR2',NULL,700,'BR2 Data') 


INPUT: 
@SubCode = 'Sub1', @Code = 'BR1' 

OUTPUT: 
Code SubCode Amt Data 
==== ======= === ==== 
BR1  Sub1 500 BR1 Sub1 Data 

INPUT: 
@SubCode = 'Sub4', @Code = 'BR1' 

OUTPUT: 
Code SubCode Amt Data 
==== ======= === ==== 
BR1  NULL 700 BR1 Data 
+0

のようなもの、あなたが使用しInsert_identityない限り、(ID列に値を挿入することはできませんon)ので、あなたの例を扱い、再度見直してください。 –

+0

これは学校の割り当てと非常によく似ています。あなた自身でこれを解決しようとしましたか?もしそうなら、あなたのコードはどこですか? – Tanner

答えて

0

まず、あなたの例では、エラーがある

SELECT * 
FROM @Configuration c 
     CROSS APPLY (SELECT TOP 1 * 
        FROM @ConfigurationDetails cd 
        WHERE c.Code = cd.Code 
          AND (c.SubCode = cd.SubCode 
            OR c.SubCode IS NULL) 
        ORDER BY cd.SubCode DESC --Order the not null match first if it exists 
        ) CA 
0
WITH cte 
AS (
     SELECT a.ID, 
       a.Code, 
       a.SubCode, 
       b.SubCode as bSubCode, 
       b.Amt, 
       b.Data, 
       ROW_NUMBER() OVER(PARTITION BY a.CODE, a.SubCode ORDER BY B.SUBCODE desc) as RN 
      FROM @Configuration as a 
      LEFT JOIN @ConfigurationDetails as b ON b.Code = a.Code 
       AND (a.SubCode = b.SubCode OR b.SubCode IS NULL) 
     ) 
     SELECT * FROM cte 
     where rn=1 
関連する問題