2016-08-04 4 views
0

空白を含まないテーブルを使用して、データとデータの間に空白を含むテーブルを比較します。空白を含まないテーブルを使用してデータ間にスペースを含むテーブルを比較します。

テーブルAからのデータを対象として

表Aのサンプルデータ、およびテーブルB Iソースとして表AのようMINUSクエリを記述する必要があり、表Bに移入、およびテーブルBれる: -

を表Aには、ID、Cd_1、およびCd_2の3つのフィールドがあります。

フィールド:Cd_1またはCd_2は、コード間にスペースを入れることができます。下記の実施例Code_1におけるXとYの間に2つの空間

ID | Cd_1 | Cd_2 
----------- 
1 | X Y | Z 

表Bには2つのフィールドを有している:ID、カドミウム

表B、表からCD_1、及びCd_2からコード(非スペース)を移入することになっています

例:

ID | Cd 
-------- 
1 | X  
1 | Y  
1 | Z 
+1

あなたは自分が物事のこれらの並べ替えを行うために必要見つけるたびちょうど一般的なコメント....(文字列分割すること)...それは一般的にあなたが設計されていないDBを持っていることを意味し、あなたが思いつく解決策はただのバンドです。 – objectNotFound

+0

あなたの質問は実際にあなたがテーブルBのすべての値がテーブルAにあるかどうかチェックしたいのですか? – cybork

答えて

0

区切り文字(スペース= '「)に基づいて、文字列を分割する表関数の使用があります。ですから、このクエリを使用することができ、テーブルBにテーブルAからコードを挿入する

CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512)) 
RETURNS table 
AS 
RETURN (
    WITH Pieces(pn, start, stop) AS (
     SELECT 1, 1, CHARINDEX(@sep, @s) 
     UNION ALL 
     SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) 
     FROM Pieces 
     WHERE stop > 0 
    ) 
    SELECT 
     SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s 
    FROM Pieces 
) 

DECLARE @st1 as varchar(max),@st2 as varchar(max), @PractitionerId int 

DECLARE MY_CURSOR CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY 
FOR 
SELECT distinct ID 
FROM [dbo].[TableA] 

OPEN MY_CURSOR 
FETCH NEXT FROM MY_CURSOR INTO @PractitionerId 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    select @st1 = Cd_1, @st2 = Cd_2 
    from [dbo].[TableA] 
    WHERE ID = @PractitionerId 

    INSERT INTO tableB (ID, Cd) select @PractitionerIdas ID ,* from dbo.Split(' ', @st1) 
    INSERT INTO tableB (Id, Cd) select @PractitionerIdas ID,* from dbo.Split(' ', @st2) 

    FETCH NEXT FROM MY_CURSOR INTO @PractitionerId 
END 
CLOSE MY_CURSOR 
DEALLOCATE MY_CURSOR 
関連する問題