2017-04-26 1 views
0

私はテーブルを持っている:私が欲しいものT-SQL CROSSが同じテーブルに適用され

Col1 Col2 Col3 
---- ---- ---- 
A  AA dfdf 
A  BB jhf 
A  CC lkji 
B  AA jkl 
B  CC ioeu 
B  DD sjdf 
C  AA zkjjj 

は、Col2にの完全なセットを見つけ、その後、それぞれのCol1のために再びテーブルにそれを追加することです他のすべてのフィールドはNULL /空白のままにします。

私は4つのテーブル(Col1の別のテーブル、Col2の別のテーブル、次にCRUSS APPLYテーブル3、最終的に元のソーステーブルに不足しているレコードを挿入する)を使用して解決策を得ました。私がそれを理解するだけで、彼らなしでこれを行うことができます。それは私が立ち往生したところです。

したがって、上記の例では、私は

Col1 Col2 Col3 
---- ---- ---- 
A  AA dfdf 
A  BB jhf 
A  CC lkji 
A  DD  
B  AA jkl 
B  BB 
B  CC ioeu 
B  DD sjdf 
C  AA zkjjj 
C  BB 
C  CC 
C  DD 

答えて

3

であなたは(あなたの「4つのテーブル」)を記述したアプローチを終わるだろう、かなりいいですが、あなたが使用してアドホック SQLを使用することができますテーブルではなくCTEsです。

DECLARE @tbl TABLE(Col1 VARCHAR(10),Col2 VARCHAR(10),Col3 VARCHAR(10)); 
INSERT INTO @tbl VALUES 
('A','AA','dfdf') 
,('A','BB','jhf') 
,('A','CC','lkji') 
,('B','AA','jkl') 
,('B','CC','ioeu') 
,('B','DD','sjdf') 
,('C','AA','zkjjj'); 

WITH Distinct1 AS(SELECT DISTINCT Col1 FROM @tbl) 
    ,Distinct2 AS(SELECT DISTINCT Col2 FROM @tbl) 
INSERT INTO @tbl(Col1,Col2,Col3) 
SELECT d1.Col1,d2.Col2,NULL 
FROM Distinct1 AS d1 
CROSS APPLY Distinct2 AS d2 
WHERE NOT EXISTS(SELECT 1 FROM @tbl WHERE Col1=d1.Col1 AND Col2=d2.Col2); 

SELECT * FROM @tbl 
ORDER BY Col1,Col2 

ヒント:このようにそれを試してみてくださいテーブルは、すべての可能な組み合わせのサブセットのを含める必要がありますたびに、これは悪いデザインのための指標であるかもしれない...

+0

はあなたにShnugoをありがとう!これはまさに私が書こうとしていたものです。あなたが好奇心を持っていれば少しのバックグラウンドがあります。私たちは約60のDBをホストしており、 "パッチ履歴"テーブルを持っています。 ExcelでDB名とパッチを作成するSPからリストを取得します。私は "DBと不足しているパッチのリスト"を求められました。この方法では、(更新されない)最新のパッチリストが含まれていなければならないテーブル(またはExcelのリスト)が必要なくなります。代わりに、あるサーバーにパッチを貼り付けることで、Excelの残りの部分にそのパッチがないと表示されます。それは少し2日のプロジェクトです。再度、感謝します! – SarahC

+0

@SarahCああ、私は見る...ハッピーコーディング! – Shnugo

関連する問題