-3

次の列を特定の番号を含む列に更新する必要があります。

ffはテーブルCの列です。

C1_K | C1_ID | C2_K | C2_ID | C3_K | C3_ID

論理:

  • 番号5が見つかった場所を探します。それはC1_KまたはC2_KまたはC3_Kです。
  • C1_Kにある場合は、テキスト値C1_IDを選択します。
  • C2_Kにある場合は、テキスト値C2_IDを選択します。
  • C3_Kにある場合は、テキスト値C3_IDを選択します。

ご意見をお聞かせください。一致するK列の横の列を更新する必要があります。ありがとう。

ノート:

  • すべてのC*_K列には一意の番号が含まれています。
  • すべてのC*_ID列には一意のテキストが含まれています。(これらは名前です)

サンプルデータ:

 154 | NULL | 155 | SantoRyUu | 156 | NULL

155を選択すると、SantoRyUuが更新されます。

4

2 に答える 2

0

* _K列にインデックスがある場合は、これを試してください。

select C1_id
from table where c1_k = 155
union all
select C2_id
from table where c2_k = 155
union all
select C3_id
from table where c3_k = 155

これらの列にインデックスがない場合

select 
--coalesce(C1_id,c2_id,c3_id) --if you are sure other two columns values will be null
case 
when c1_k = 155 then c1_id 
when c2_k = 155  then c2_id 
when c3_k = 155 then c3_id 
end --in case you have values for other columns as 
--well like for 154 you might not have null but some other value..

from table where c1_k = 155
or c2_k = 155
or c3_k = 155

このような列がさらにある場合は、上記のクエリを変更してください。ただし、最善の解決策は、列を行にすることです。

于 2012-07-23T17:23:04.430 に答える
0

(設計上の問題はさておき。)

SQL Serverには「次へ」の構文がないため、列を名前で指定する必要があります。動的SQLでこれを行うことができるかもしれませんが、やっかいです。これが1つの可能性です:

CREATE TABLE dbo.C
(
  C1_K  INT, 
  C1_ID VARCHAR(32), 
  C2_K  INT, 
  C2_ID VARCHAR(32), 
  C3_K  INT, 
  C3_ID VARCHAR(32)
);

INSERT dbo.C(C1_K, C2_K, C3_k)
SELECT 5,1,2
UNION ALL SELECT 2,5,7
UNION ALL SELECT 3,4,6;

DECLARE @MagicNumber INT;
SET @MagicNumber = 5;

UPDATE dbo.C SET 
 C1_ID = CASE C1_K WHEN @MagicNumber THEN 'yes' ELSE C1_ID END,
 C2_ID = CASE C2_K WHEN @MagicNumber THEN 'yes' ELSE C2_ID END,
 C3_ID = CASE C3_K WHEN @MagicNumber THEN 'yes' ELSE C3_ID END;

SELECT * FROM dbo.C;

結果:

C1_K  C1_ID  C2_K  C2_ID  C3_K  C3_ID
----  -----  ----  -----  ----  -----
5     yes    1     NULL   2     NULL
2     NULL   5     yes    7     NULL
3     NULL   4     NULL   6     NULL
于 2012-07-23T16:05:23.093 に答える