2017-03-25 13 views
4

でカラムを連結することは、他のテーブルからの列のデータを連結して1つのテーブル列のデータを更新することが可能だろうか? studentdetails二つのテーブル

╔════════╦═══════════════════╗ 
║ ID  ║ UserName   ║ 
╠════════╬═══════════════════╣ 
║ 1 ║ raj_12_kumar  ║ 
║ 2 ║ test_13_test  ║ 
╚════════╩═══════════════════╝ 

は、今私はUserName列データを分割し、そのから2番目のトークンを取得したいと:studentaccess

╔════════╦══════════╗ 
║ UserID ║ AccCode ║ 
╠════════╬══════════╣ 
║ 12 ║ Tom  ║ 
║ 13 ║ Ann  ║ 
╚════════╩══════════╝ 

表B:

表A、私は簡単な例で説明しましょうUserIDを照合することによってstudentaccessテーブルを照会し、それからAccCode値を取得し、UserName列データの第2のトークンと同じを連結。最後に、私はいずれは私が連結するのに役立ち

select regexp_substr(UserName, '([^_]+)(_[^_]+){1}$', 1, 1, null, 1) as userId from studentdetails 

╔════════╦═══════════════════╗ 
║ ID  ║ UserName   ║ 
╠════════╬═══════════════════╣ 
║ 1 ║ 12_Tom   ║ 
║ 2 ║ 13_Ann   ║ 
╚════════╩═══════════════════╝ 

SUBSTRクエリの下に、私はstudentdetails表にUserName列からUserId値を得ることができますから、以下のようなstudentdetailsテーブルデータの何かが必要Acccodeと同じで、UserNameの列を更新しますか?

+0

あなたは、4つの異なるDBをタグ付け。どちらを実際に使用しますか? –

+0

Oracleデータベース –

+0

あなたは他のDBMSシステムにタグを付けましたが、oracleはタグ付けしていませんか? –

答えて

1

あなたは私が私の最後でテストおよび検証されている次のクエリを、使用することができます。あなたはこのsqlfiddleでOracleのバージョンをチェックアウトすることができ

http://sqlfiddle.com/#!4/cd66c/1

Oracleバージョン

UPDATE studentdetails sd 
SET sd.UserName = 
    (SELECT to_char(x.UserID) || '_' || sa.AccCode 
    FROM 
    (SELECT sd1.ID as ID, SUBSTR(sd1.UserName, INSTR(sd1.UserName,'_') + 1, INSTR(sd1.UserName,'_', INSTR(sd1.UserName,'_') + 1) - 1 - INSTR(sd1.UserName,'_')) AS UserID 
     FROM studentdetails sd1 
    ) x INNER JOIN studentaccess sa ON TO_NUMBER(x.UserID) = sa.UserID where sd.ID = x.ID 
); 

SQL Serverバージョン

UPDATE studentdetails 
SET UserName = 
    (SELECT x.UserID + '_' + sa.AccCode 
    FROM 
    (SELECT SUBSTRING(sd1.UserName, CHARINDEX('_', sd1.UserName) + 1, CHARINDEX('_', sd1.UserName, CHARINDEX('_', sd1.UserName) + 1) - 1 - CHARINDEX('_', sd1.UserName)) AS UserID 
     FROM studentdetails sd1 
     WHERE sd1.ID = studentdetails.ID) x 
    INNER JOIN studentaccess sa ON x.UserID = sa.UserID); 

UPDATE 1

あなたはstudentdetailsテーブルの列のユーザー名の文字列UNKNOWNをしたい場合studentaccess表がstudentdetailsテーブルから取得したユーザーIDが含まれていない場合は、以下のクエリを使用することができます。

sqlfiddleが何らかの問題までロードされていないので、私はsqlfiddleでそれを試してみることができませんでした。オンラインに戻ったときはいつでも、試してみましょう。その間に、あなたはあなたの最後にこれを試して、私に問題を知らせることができます。

UPDATE studentdetails sd 
SET sd.UserName = 
    (SELECT CASE when x.ID is null then 'UNKNOWN' else to_char(x.UserID) || '_' || sa.AccCode END 
    FROM 
    (SELECT sd1.ID as ID, SUBSTR(sd1.UserName, INSTR(sd1.UserName,'_') + 1, INSTR(sd1.UserName,'_', INSTR(sd1.UserName,'_') + 1) - 1 - INSTR(sd1.UserName,'_')) AS UserID 
     FROM studentdetails sd1 
    ) x RRIGHT OUTER JOIN studentaccess sa ON TO_NUMBER(x.UserID) = sa.UserID where sd.ID = x.ID 
); 
+0

あなたのソリューションも期待どおりに動作していますが、私は少し変更を加える必要があります。 saと一致するものが見つかったら好きです。userIdであれば、concatinated文字列を更新する必要があります。そうでない場合は、文字列 'UNKNOWN'で更新する必要があります。ケース(時/時)を使って試してみましたが、同じ問題が発生しましたが、これに代わる方法はありますか? –

+0

@SQLLearnerので、studentaccessテーブルにUserIDが含まれていない場合はUNKNOWNに更新してください。あれは正しいですか? – Sunil

+0

@SQLLearner、UPDATE 1の下のクエリを試してみてください。 – Sunil

0

あなたは、ほとんどの近くにあります。他の列をuserNameと連結することができます。

regexp_substr(UserName, '([^_]+)(_[^_]+){1}$', 1, 1, null, 1) || '_' || acccode 

あなたのサンプルデータがこのようになるとの結果 -

select userid, regexp_substr(UserName, '([^_]+)(_[^_]+){1}$', 1, 1, null, 1) || '_' || acccode as username from 
(
select 1 UserID, 'Tom' AccCode from dual 
union 
select 1 userid , 'Ann' AccCode from dual) studentaccess, 
(select 1 ID, 'raj_12_kumar' username from dual 
union 
select 2 id, 'test_13_test' username from dual) studentdetails 
where studentaccess.userid = studentdetails.ID 
2
UPDATE StudentDetails sd 
SET UserName = 
( 
    SELECT userid||'_'||AccCode 
    FROM StudentAccess sa 
    WHERE regexp_substr(sd.UserName, '([^_]+)(_[^_]+){1}$', 1, 1, null, 1) = sa.userid 
); 
+0

期待どおりに動作しており、クエリに少し修正が必要です。 sa.useridと一致するものが見つかった場合は、文字列 'UNKNOWN'で更新する必要があるcncatinated文字列を更新する必要があります。ケース(時/時)を使って試してみましたが、同じ問題が発生しましたが、これに代わる方法はありますか? –