1

既存のテーブルに新しい列を追加しました。別のテーブルから取得した値を入力したいと考えています。

テーブル:EXPORT

Name | email | employeeid | userid

テーブル:USER

id |  name  | email  | idnumber

新しい列は ですEXPORT.userid。これを に等しくしたいと思いUSER.idます。ididnumber は同じではないことに注意してください-ストアidnumberは自動インクリメント PK です。に等しいです。employeeididUSER.idnumberEXPORT.employeeid

whenを入力EXPORT.useridしたい。USER.idexport.employeeid = user.idnumber

Oracle 互換の SQL コードを使用してこれを行うにはどうすればよいですか?

以下を試してみましたが、エラーが発生します。

UPDATE EXPORT  
   SET userid = ( SELECT id 
                FROM USER 
               WHERE USER.idnumber = EXPORT.employeeid 
                 and USER.EMAIL = EXPORT.email) 
 WHERE EXISTS( SELECT 1
             FROM USER
            WHERE USER.idnumber = EXPORT.employeeid 
              and USER.EMAIL = EXPORT.email) 

しかし、私はこのエラーが発生します

[Error] Execution (2: 19): ORA-01427: single-row subquery returns more than one row
4

2 に答える 2

1

おそらく、このサブクエリは、指定された電子メールと ID 番号に対して複数の行を返します。

SELECT id 
                FROM USER 
               WHERE USER.idnumber = EXPORT.employeeid 
                 and USER.EMAIL = EXPORT.email

DISTINCT を使用して重複を除外してみてください。

SELECT DISTINCT id 
                FROM USER 
               WHERE USER.idnumber = EXPORT.employeeid 
                 and USER.EMAIL = EXPORT.email

または、サンプル データを質問に追加します。テーブル USER と EXPORT の一意のキーは何ですか?

于 2013-07-19T14:50:39.627 に答える
0

次のクエリを実行してみてください

SELECT * FROM (
    SELECT USER.idnumber, USER.EMAIL, COUNT(*) AS cnt
    FROM USER
    GROUP BY USER.idnumber, USER.EMAIL
) c
WHERE c.cnt > 1

行が表示される場合は、これが問題です。

たとえば、次のような USER テーブルがあるとします。

id |  name    |      email         | idnumber
1  | icefresh | icefresh@what.ever | 100
2  | icefresh | icefresh@what.ever | 100

次に、クエリ

SELECT id 
FROM USER 
WHERE USER.idnumber = EXPORT.employeeid 
    and USER.EMAIL = EXPORT.email

1 と 2 を返します。機能させるために、1 つの値のみを返すことができます。

于 2013-07-19T15:16:01.553 に答える