0

私は他の2つのマスターテーブルに基づいて入力したいSQLマスターテーブルを持っていCHANNEL_PT ます.CHANNELPT

3 つの列のCHANNEL_PTcosist CHANNEL_PT_CDCHANNEL_CDおよびPT_CD.

レコードを挿入するシナリオは、テーブルにCHANNEL_PT2 つのエントリがある場合、CHANNEL

ここに画像の説明を入力

PT以下の表の2 つのエントリ、

ここに画像の説明を入力

次に、CHANNEL_PTテーブルは次のようになります

ここに画像の説明を入力

これができることは知っていましたCURSORが、パフォーマンス上の懸念から使用していません。

期待される結果を得るために以下のようにクエリを作成しましたが、他のより効率的な方法または最適化されたクエリを知りたいです。

BEGIN TRANSACTION
DECLARE @CH INT;
DECLARE @CH_CNT INT;
DECLARE @CH_MAX INT; 
SELECT @CH_MAX = MAX(CHANNEL_CD) FROM CHANNEL;
SELECT @CH = ISNULL(MIN(CHANNEL_CD),0),@CH_CNT=COUNT(CHANNEL_CD) FROM CHANNEL WHERE CHANNEL_CD > -1

WHILE @CH <= @CH_MAX

BEGIN
    DECLARE @PT INT;
    DECLARE @PT_CNT INT;
    DECLARE @PT_MAX INT; 
    SELECT @PT_MAX = MAX(PT_CD) FROM PT;
    SELECT @PT = ISNULL(MIN(PT_CD),0),@PT_CNT=COUNT(PT_CD) FROM PT WHERE PT_CD > -1
    WHILE @PT <=@PT_MAX
        BEGIN
            DECLARE @CPT INT;
            SELECT @CPT = ISNULL(MAX(CHANNEL_PT_CD),0) FROM CHANNEL_PT
            IF NOT EXISTS(SELECT CHANNEL_CD,PT_CD FROM CHANNEL_PT WHERE CHANNEL_CD=@CH and PT_CD=@PT)
                BEGIN
                    INSERT INTO CHANNEL_PT VALUES(@CPT+1,@CH,@PT)
                END
            SELECT @PT = MIN(PT_CD) FROM PT WHERE PT_CD > @PT
        END 
    SELECT @CH=MIN(CHANNEL_CD) FROM CHANNEL WHERE CHANNEL_CD > @CH
END
COMMIT;
4

2 に答える 2

0

してみてください:

DECLARE @CPT INT=0;
SELECT @CPT = ISNULL(MAX(CHANNEL_PT_CD),0) FROM CHANNEL_PT

INSERT INTO CHANNEL_PT
SELECT DISTINCT @CPT+ROW_NUMBER() OVER(ORDER BY b.CHANNEL_CD),
     b.CHANNEL_CD, 
     c.PT
FROM CHANNEL b, PT c
WHERE (SELECT COUNT(*) FROM CHANNEL_PT a 
       WHERE a.CHANNEL_CD=b.CHANNEL_CD AND a.PT_CD=c.PT)=0
于 2013-11-01T05:18:15.650 に答える