Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle REF không thể vượt qua

Bạn cần đặt bí danh cho bảng và sau đó tham khảo cột bằng cách:

<table_alias>.<ref_column>.<object_field>

SQL Fiddle

Thiết lập lược đồ Oracle 11g R2 :

create or replace type t_document as object  
( IdDocument     Number(10) )  
/

create table document of t_document(   
    primary key(IdDocument)) 
/

INSERT INTO document 
          SELECT t_document( 1 ) FROM DUAL
UNION ALL SELECT t_document( 2 ) FROM DUAL
/

create or replace type t_emprunteur as object  
( IdEmprunteur     Number(10) )  
/

create table emprunteur of t_emprunteur(   
    primary key(IdEmprunteur)) 
/

INSERT INTO emprunteur 
          SELECT t_emprunteur( 1 ) FROM DUAL
UNION ALL SELECT t_emprunteur( 2 ) FROM DUAL
/

create or replace type t_exemplaire as object  
( IdExemplaire     Number(10),  
  NumeroRayon      Number(5),  
  Document         ref t_document )  
/

create table exemplaire of t_exemplaire(   
    primary key(IdExemplaire),  
    constraint Document_c CHECK ( Document is not null)) 

/

INSERT INTO exemplaire
          SELECT t_exemplaire( 1, 13, (SELECT REF(d) FROM document d WHERE d.IdDocument = 2) ) FROM DUAL
UNION ALL SELECT t_exemplaire( 2, 42, (SELECT REF(d) FROM document d WHERE d.IdDocument = 1) ) FROM DUAL
/

create or replace type t_emprunt as object  
( IdEmprunt         Number(10),  
  DateD             DATE,    
  DateF             DATE,  
  Emprunteur_ref    ref t_emprunteur,  
  Exemplaire_ref    ref t_exemplaire )

/

create table emprunt of t_emprunt(  
    primary key(IdEmprunt),  
    Emprunteur_ref scope is emprunteur,  
    Exemplaire_ref scope is exemplaire,  
    DateD default sysdate)    
/

INSERT INTO emprunt
          SELECT t_emprunt( 1,
                            SYSDATE,
                            SYSDATE - 1,
                            (SELECT REF(e) FROM emprunteur e WHERE e.IdEmprunteur = 1),
                            (SELECT REF(e) FROM exemplaire e WHERE e.IdExemplaire = 2)
                          ) FROM DUAL
UNION ALL SELECT t_emprunt( 2,
                            TO_DATE( '2000/01/01', 'YYYY/MM/DD' ),
                            TO_DATE( '2001/12/31', 'YYYY/MM/DD' ),
                            (SELECT REF(e) FROM emprunteur e WHERE e.IdEmprunteur = 2),
                            (SELECT REF(e) FROM exemplaire e WHERE e.IdExemplaire = 1)
                          ) FROM DUAL
/

CREATE INDEX emprunt_emprunteur_ref_idx ON emprunt (Emprunteur_ref)
/

Truy vấn 1 :

SELECT e.IdEmprunt,
       e.Emprunteur_ref.IdEmprunteur,
       e.Exemplaire_ref.IdExemplaire,
       e.Exemplaire_ref.NumeroRayon,
       e.Exemplaire_ref.Document.IdDocument
FROM   emprunt e

Kết quả :

| IDEMPRUNT | EMPRUNTEUR_REF.IDEMPRUNTEUR | EXEMPLAIRE_REF.IDEXEMPLAIRE | EXEMPLAIRE_REF.NUMERORAYON | EXEMPLAIRE_REF.DOCUMENT.IDDOCUMENT |
|-----------|-----------------------------|-----------------------------|----------------------------|------------------------------------|
|         1 |                           1 |                           2 |                         42 |                                  1 |
|         2 |                           2 |                           1 |                         13 |                                  2 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các lựa chọn thay thế cho LIMIT và OFFSET để phân trang trong Oracle

  2. Bác sĩ lập lịch thiết kế cơ sở dữ liệu

  3. Cách thực hiện Pivoting trong Oracle 10g

  4. Cách chọn một cột có điều kiện trong truy vấn Oracle

  5. Tạo tệp đầu ra định dạng phẳng có chiều rộng cố định từ truy vấn SQL