3

従業員テーブルがあり、給与テーブルが含まれています。現在の従業員全員に 10% の増額を行いたいと考えています。すべての従業員の給与日付を特定の日付に更新しようとしましたが、単一行のサブクエリで問題が発生しました。

私のデータベースは次のようになります:

CREATE TYPE TEMPORAL_VARCHAR AS OBJECT (
VALID_TIME_LOWER_BOUND DATE,
VALID_TIME_UPPER_BOUND DATE,
VALUE_PART VARCHAR2(50) );
CREATE TYPE TEMPORAL_NUMBER AS OBJECT (
VALID_TIME_LOWER_BOUND DATE,
VALID_TIME_UPPER_BOUND DATE,
VALUE_PART NUMBER );

CREATE TYPE NAME_TYPE AS TABLE OF TEMPORAL_VARCHAR;
CREATE TYPE ADDRESS_TYPE AS TABLE OF TEMPORAL_VARCHAR;
CREATE TYPE DEPARTMENT_TYPE AS TABLE OF TEMPORAL_VARCHAR;
CREATE TYPE MANAGER_TYPE AS TABLE OF TEMPORAL_VARCHAR;
CREATE TYPE SALARY_TYPE AS TABLE OF TEMPORAL_NUMBER;

CREATE TABLE EMPLOYEE (
SSN NUMBER primary key,
NAME NAME_TYPE,
ADDRESS ADDRESS_TYPE ,
BIRTH_DATE DATE,
MANAGER MANAGER_TYPE ,
DEPARTMENT DEPARTMENT_TYPE,
SALARY SALARY_TYPE
)
NESTED TABLE NAME STORE AS NAME_TABLE,
NESTED TABLE ADDRESS STORE AS ADDRESS_TABLE,
NESTED TABLE MANAGER STORE AS MANAGER_TABLE,
NESTED TABLE DEPARTMENT STORE AS DEPARTMENT_TABLE,
NESTED TABLE SALARY STORE AS SALARY_TABLE
;

この問題を解決するには?私はこれをやろうとしました

UPDATE TABLE(
SELECT E.SALARY
FROM EMPLOYEE E
) SAL
SET SAL.VALID_TIME_UPPER_BOUND = '11.16.2015'
WHERE SAL.VALID_TIME_UPPER_BOUND = TO_DATE('12.31.9999','MM.DD.YYYY');
4

2 に答える 2

0

このような反復を使用して問題を解決しました

BEGIN
  FOR employees IN (SELECT SSN FROM EMPLOYEE)
  LOOP
UPDATE TABLE(
SELECT E.SALARY
FROM EMPLOYEE E
WHERE E.SSN = employees.SSN
) SAL
SET SAL.VALID_TIME_UPPER_BOUND = '11.16.2015'
WHERE SAL.VALID_TIME_UPPER_BOUND = TO_DATE('12.31.9999','MM.DD.YYYY');
  END LOOP;
END;
于 2015-11-16T00:43:03.967 に答える
0

1つ目は重複する可能性があります

2回目のサンプルはこちら

whereコードの3番目に、条件を選択する必要があります

UPDATE TABLE(
  SELECT E.SALARY
    FROM EMPLOYEE E 
      WHERE ssn in (SELECT ssn FROM EMPLOYEE e
   WHERE to_date('01.01.2015','mm.dd.yyyy')  in (
      SELECT VALID_TIME_UPPER_BOUND FROM TABLE(e.salary)
     ) 
   )
) SAL
SET SAL.VALID_TIME_UPPER_BOUND =  to_date('01.01.9999','mm.dd.yyyy')

test data

INSERT INTO EMPLOYEE(SSN, salary) values (1, SALARY_TYPE ());
INSERT INTO EMPLOYEE(SSN, salary) values (2, SALARY_TYPE ());
INSERT INTO EMPLOYEE(SSN, salary) values (3, SALARY_TYPE ());

INSERT INTO TABLE(SELECT salary FROM EMPLOYEE 
   WHERE ssn = 1)
   VALUES (to_date('01.01.2005','mm.dd.yyyy'), to_date('01.01.2015','mm.dd.yyyy'), 1);

INSERT INTO TABLE(SELECT salary FROM EMPLOYEE 
   WHERE ssn = 2)
   VALUES (to_date('02.02.2005','mm.dd.yyyy'), to_date('02.02.2015','mm.dd.yyyy'), 2);


INSERT INTO TABLE(SELECT salary FROM EMPLOYEE 
   WHERE ssn = 3)
   VALUES (to_date('03.03.2005','mm.dd.yyyy'), to_date('03.03.2015','mm.dd.yyyy'), 3);

ps 複雑さが本当に必要ですか?

于 2015-11-15T22:44:54.900 に答える