1


0

私は* UsersInAuthentication *というSQLテーブルを持っています。

-----------------------
| AuthUserId | UserId |
|    1       |    4   |
|    1       |    5   |
|    1       |    8   |
-----------------------

私はすべてのユーザーに単一のストアドプロシージャを持つ文字列として "(4,5,8)"の形式で取得したいと考えています。可能であればこの形式で挿入、更新、削除の操作もしたいと思います。

編集: SQL Server 2005を使用しています。

5 Answer


4


テーブルの目的を少し上回る。 また、これを更新するのはトリッキーになる可能性があります。

あなたはどちらかあなたのテーブルのデザインを再考するか、あなたがそれを使用しようとしている方法を再考する必要があるように思える。


3


SQL Serverを使用しているので、これを実行できます。

@listを宣言するnvarchar(max)select @list = ''

@list = ''、次にuserid else '、' useridがUsersInAuthenticationの最後にある場合、@list = @listの大文字小文字を選択します。

set @list = '(' substring(@list、1、999) ')' @listを表示する

これは、各行の値を変数の現在の値に追加することによって変数を構築するための気の利いたトリックです。 テーブル操作などではかなり便利です。

子孫のために:

MySQLでは、 group_concatを使用できます。

UserInAuthenticationからconcat( '(' group_concat(ユーザーID区切り文字によるユーザーIDの順序 '、') ')')を選択します。

Oracleでは、カーソルを使用できます。

cursor c_usersは、usersinauthenticationからuseridを選択します。 out_users varchar2(4000); out_usersがnullの場合、c_usersループ内のr_userに対して開始し、out_users:= r_user.first_Name;そうでなければout_users:= out_users || '、' || r_user.first_Name;もしもループ終了out_usersを返します。


2


SQLServerと仮定します。

 -  // testdata WITH UsersInAuthentication(AuthUserId、UserId)AS(SELECT 1、4 UNION ALL SELECT 1、5 UNION ALL SELECT 1、8) -  //実際のクエリSELECT AuthUserId、(SELECT cast(UserId as varchar) '、 'UsersInAuthenticationからのユーザーID、またはXMLパス(' ')に対するユーザーIDからのユーザーIDとしてのUsersInAuthentication GROUP BY AuthUserId

取得するため:

AuthUserId UserIds ----------- -------- 1 4,5,8、


0


実際のクエリは本当に DBMSに依存します。 MySQLを仮定します。

SELECT GROUP_CONCAT(UserId)FROM UsersInAuthentication; UPDATE UsersInAuthentication SET ... どこにユーザーID(4,5,8); UsersInAuthenticationからUserId IN(4,5,8)に削除します。 UsersInAuthentication(UserId)値に挿入します。(4)、(5)、(8)。

しかし、データベース内でコンマ区切りの値を処理すると、どうにかしてその点を見逃してしまうことに注意してください。


-1


UsersInAuthenticationからのSELECT CONCAT( '('、GROUP_CONCAT(UserId SEPARATOR '、')、 ')');