私はテーブルT1を持っています
Id | Col1 | Col2 | アクティブです |
---|---|---|---|
1 | T1 | v1 | 1 |
2 | T2 | v2 | 0 |
次のデータを受け取りました。上記のテーブルに挿入する必要があります。
| Col1 | Col2 |
|--------|--------|
| T1 | v1 |
| T2 | v2 |
| T3 | v3 |
このデータには重複した値が含まれているため、IsActive列の値に基づいて挿入する必要があります。IsActive 1の行の場合、IsActive 2で挿入する必要があり、IsActive 0の行の場合、以下のようにIsActive 1で挿入する必要があり、一意のデータをIsActive 1で挿入する必要がありますが、現時点では問題ありません。
Id | Col1 | Col2 | アクティブです |
---|---|---|---|
1 | T1 | v1 | 1 |
2 | T2 | v2 | 0 |
3 | T1 | v1 | 2 |
4 | T2 | v2 | 1 |
5 | T3 | v3 | 1 |
一時テーブル#Tempを作成し、以下のように、新しい受信データと既存のテーブルからのデータに共通の行を挿入しました。
#Temp
Col1 | Col2 | アクティブです |
---|---|---|
T1 | v1 | 1 |
T2 | v2 | 0 |
T1 | v1 | ヌル |
T2 | v2 | ヌル |
Group Byを使用すると、重複する行を選択できますが、IsActive値に基づいて挿入する必要があるため、ここで立ち往生しました。
insert into T1
select Col1, Col2, '1' from #Temp
GROUP BY Col1, Col2
HAVING COUNT(Col1) > 1
私はこの上記の部分で助けが必要です、事前に感謝します
Try this:
-- create temp table with values to be inserted
INSERT INTO #ToInsert
([Col1], [Col2])
VALUES
('T1', 'v1'),
('T2', 'v2'),
('T3', 'v3')
-- join each value of the temp table to the original table. if
-- value exists increment its `IsActive` by 1, otherwise set it to 1
INSERT INTO t (Col1, Col2, IsActive)
SELECT i.Col1, i.Col2, COALESCE(t.IsActive + 1, 1) AS IsActive
FROM #ToInsert i
LEFT JOIN (
SELECT Col1, Col2, max(IsActive) as IsActive
FROM t
GROUP BY Col1, Col2
) t ON i.Col1 = t.Col1 AND i.Col2 = t.Col2
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加