Sei sulla pagina 1di 33

Banco de Dados

Introduo ao SQL
Aula 08
Attilio Zanelatto Neto

Aulas prticas

Tipos de Condies de Juno (Join)


Equijoin
Colunas com o mesmo nome;
Colunas com nomes diferentes;

Outerjoin
Left (tabela de conduo esquerda)
Right (tabela de conduo direita)
Full (completa) (ambas as tabelas de conduo)

Cross / Produto Cartesiano

Um novo modelo
emp

bonus

EMPNO

ENAME

salgrade

ENAME

JOB

GRADE

JOB

SAL

LOSAL

MGR

COMM

HISAL

HIREDATE
SAL

locations

COMM

ID

DEPTNO (FK)

CITY

dept
DEPTNO
DNAME
LOC_ID

STATE_TX
3

Criando as tabelas
CREATE TABLE BONUS
(
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
SAL NUMBER,
COMM NUMBER
) ;
CREATE TABLE DEPT
(
DEPTNO NUMBER(2,0),
DNAME VARCHAR2(14),
LOC_ID NUMBER(*,0)
) ;
CREATE TABLE EMP
(
EMPNO NUMBER(4,0),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4,0),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2,0)
) ;

CREATE TABLE LOCATIONS


(
ID NUMBER(*,0),
CITY CHAR(12),
STATE_TX CHAR(2)
) ;
CREATE TABLE SALGRADE
(
GRADE NUMBER,
LOSAL NUMBER,
HISAL NUMBER
) ;

Inserindo os dados no modelo


REM INSERTING into DEPT
Insert into DEPT (DEPTNO,DNAME,LOC_ID)
Insert into DEPT (DEPTNO,DNAME,LOC_ID)
Insert into DEPT (DEPTNO,DNAME,LOC_ID)
Insert into DEPT (DEPTNO,DNAME,LOC_ID)
REM INSERTING into EMP
Insert into EMP values
Insert into EMP values
Insert into EMP values
Insert into EMP values
Insert into EMP values
Insert into EMP values
Insert into EMP values
Insert into EMP values
Insert into EMP values
Insert into EMP values
Insert into EMP values
Insert into EMP values
Insert into EMP values
Insert into EMP values

values
values
values
values

(10,'ACCOUNTING',1);
(20,'RESEARCH',2);
(30,'SALES',null);
(40,'OPERATIONS',4);

(7369,'SMITH','CLERK',7902,to_date('17-DEC-80','DD-MON-RR'),800,null,20);
(7499,'ALLEN','SALESMAN',7698,to_date('20-FEB-81','DD-MON-RR'),1600,300,30);
(7521,'WARD','SALESMAN',7698,to_date('22-FEB-81','DD-MON-RR'),1250,500,30);
(7566,'JONES','MANAGER',7839,to_date('02-APR-81','DD-MON-RR'),2975,null,20);
(7654,'MARTIN','SALESMAN',7698,to_date('28-SEP-81','DD-MON-RR'),1250,1400,null);
(7698,'BLAKE','MANAGER',7839,to_date('01-MAY-81','DD-MON-RR'),2850,null,30);
(7782,'CLARK','MANAGER',7839,to_date('09-JUN-81','DD-MON-RR'),2450,null,10);
(7788,'SCOTT','ANALYST',7566,to_date('19-APR-87','DD-MON-RR'),3000,null,20);
(7839,'KING','PRESIDENT',null,to_date('17-NOV-81','DD-MON-RR'),5000,null,10);
(7844,'TURNER','SALESMAN',7698,to_date('08-SEP-81','DD-MON-RR'),1500,0,30);
(7876,'ADAMS','CLERK',7788,to_date('23-MAY-87','DD-MON-RR'),1100,null,20);
(7900,'JAMES','CLERK',7698,to_date('03-DEC-81','DD-MON-RR'),950,null,30);
(7902,'FORD','ANALYST',7566,to_date('03-DEC-81','DD-MON-RR'),3000,null,20);
(7934,'MILLER','CLERK',7782,to_date('23-JAN-82','DD-MON-RR'),1300,null,10);

REM INSERTING into LOCATIONS


Insert into LOCATIONS (ID,CITY,STATE_TX)
Insert into LOCATIONS (ID,CITY,STATE_TX)
Insert into LOCATIONS (ID,CITY,STATE_TX)
Insert into LOCATIONS (ID,CITY,STATE_TX)

values
values
values
values

(1,'NEW YORK','NY');
(2,'DALLAS','TX');
(3,'CHICAGO','IL');
(4,'BOSTON','MA');

REM INSERTING into SALGRADE


Insert into SALGRADE (GRADE,LOSAL,HISAL)
Insert into SALGRADE (GRADE,LOSAL,HISAL)
Insert into SALGRADE (GRADE,LOSAL,HISAL)
Insert into SALGRADE (GRADE,LOSAL,HISAL)
Insert into SALGRADE (GRADE,LOSAL,HISAL)

values
values
values
values
values

(1,700,1200);
(2,1201,1400);
(3,1401,2000);
(4,2001,3000);
(5,3001,9999);

Criando as constraints
ALTER TABLE BONUS ADD CONSTRAINT BONUS_PK PRIMARY KEY (ENAME, JOB) ENABLE;

ALTER TABLE EMP ADD CONSTRAINT EMP_UN UNIQUE (ENAME) ENABLE;


ALTER TABLE EMP ADD CONSTRAINT PK_EMP PRIMARY KEY (EMPNO) ENABLE;
ALTER TABLE LOCATIONS ADD CONSTRAINT LOCATIONSPK PRIMARY KEY (ID) ENABLE;
ALTER TABLE LOCATIONS MODIFY (ID NOT NULL ENABLE);
ALTER TABLE DEPT ADD CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO) ENABLE;
CREATE UNIQUE INDEX LOCATIONSPK ON LOCATIONS (ID);
CREATE UNIQUE INDEX EMP_UN ON EMP (ENAME);
CREATE UNIQUE INDEX BONUS_PK ON BONUS (ENAME, JOB);
CREATE UNIQUE INDEX PK_EMP ON EMP (EMPNO);
CREATE UNIQUE INDEX PK_DEPT ON DEPT (DEPTNO);
6

Criando as constraints (cont.)


ALTER TABLE BONUS ADD CONSTRAINT BONUS_FK FOREIGN KEY (ENAME)
REFERENCES EMP (ENAME) ENABLE;
ALTER TABLE DEPT ADD CONSTRAINT DEPT_FK FOREIGN KEY (LOC_ID)
REFERENCES LOCATIONS (ID) ENABLE;
ALTER TABLE EMP ADD CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO)
REFERENCES DEPT (DEPTNO) ENABLE;

Select
Select * from emp;
EMPNO
ENAME
---------- ---------7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
14 rows selected.

JOB
MGR HIREDATE
SAL
COMM
DEPTNO
--------- ----- --------- ---------- ---------- ---------CLERK
7902 17-DEC-80
800
20
SALESMAN
7698 20-FEB-81
1600
300
30
SALESMAN
7698 22-FEB-81
1250
500
30
MANAGER
7839 02-APR-81
2975
20
SALESMAN
7698 28-SEP-81
1250
1400
MANAGER
7839 01-MAY-81
2850
30
MANAGER
7839 09-JUN-81
2450
10
ANALYST
7566 19-APR-87
3000
20
PRESIDENT
17-NOV-81
5000
10
SALESMAN
7698 08-SEP-81
1500
0
30
CLERK
7788 23-MAY-87
1100
20
CLERK
7698 03-DEC-81
950
30
ANALYST
7566 03-DEC-81
3000
20
CLERK
7782 23-JAN-82
1300
10

Select
select * from dept;
DEPTNO DNAME
LOC_ID
---------- -------------- -----10 ACCOUNTING
1
20 RESEARCH
2
30 SALES
40 OPERATIONS
4
4 rows selected.

select * from locations;


ID CITY
ST
---------- ------------ -1 NEW YORK
NY
2 DALLAS
TX
3 CHICAGO
IL
4 BOSTON
MA
4 rows selected.

select * from salgrade;


GRADE
LOSAL
HISAL
---------- ---------- ---------1
700
1200
2
1201
1400
3
1401
2000
4
2001
3000
5
3001
9999
5 rows selected.

select * from bonus;


no rows selected

Equijoin Tradicional
SELECT e.ename AS Employee_name,
d.deptno,
d.dname AS Department_name
FROM emp e,
dept d
WHERE e.deptno = d.deptno;
EMPLOYEE_N
DEPTNO DEPARTMENT_NAM
---------- ---------- -------------SMITH
20 RESEARCH
ALLEN
30 SALES
WARD
30 SALES
JONES
20 RESEARCH
BLAKE
30 SALES
CLARK
10 ACCOUNTING
SCOTT
20 RESEARCH
KING
10 ACCOUNTING
TURNER
30 SALES
ADAMS
20 RESEARCH
JAMES
30 SALES
FORD
20 RESEARCH
MILLER
10 ACCOUNTING
13 linhas selecionadas.

Prefixo da tabela
necessria para
remover a ambiguidade
em colunas comuns
As condies de Join
devem ser listadas.

Sintaxe ANSI de um Equijoin Natural


SELECT ename AS employee_name,
deptno,
dname AS department_name
FROM emp
NATURAL JOIN dept;
EMPLOYEE_N
DEPTNO DEPARTMENT_NAM
---------- ---------- -------------SMITH
20 RESEARCH
ALLEN
30 SALES
WARD
30 SALES
JONES
20 RESEARCH
BLAKE
30 SALES
CLARK
10 ACCOUNTING
SCOTT
20 RESEARCH
KING
10 ACCOUNTING
TURNER
30 SALES
ADAMS
20 RESEARCH
JAMES
30 SALES
FORD
20 RESEARCH
MILLER
10 ACCOUNTING

13 linhas selecionadas.

No necessrio o prefixo da
tabela se a coluna parte da
condio de join..

Sem vrgulas entre as tabelas.

Sintaxe ANSI de um Equijoin Using


Prefixo da tabela permitido em campos
que no fazem parte do clusula USING
(condio de join)

SELECT d.dname,
e.ename
FROM emp e
JOIN dept d USING ( deptno );
DNAME
-------------RESEARCH
SALES
SALES
RESEARCH
SALES
ACCOUNTING
RESEARCH
ACCOUNTING
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING

ENAME
---------SMITH
ALLEN
WARD
JONES
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

13 linhas selecionadas.

Vrias colunas compartilham


o mesmo nome, juntando-se
apenas algumas delas, neste
caso deptno.

Adicionar colunas de juno adicionais


usando (Deptno, join_col2, join_col3, ...)

Sintaxe Tradicional de Equijoin


SELECT d.dname,
l.city
FROM dept d,
locations l
WHERE d.loc_id = l.id;
DNAME
CITY
-------------- -----------ACCOUNTING
NEW YORK
RESEARCH
DALLAS
OPERATIONS
BOSTON
3 rows selected.

Os nomes das colunas do Join


so diferentes.

Sintaxe ANSI de On Equijoin


Use ON quando os nomes das
SELECT d.dname,
colunas de Join so
l.city
diferentes.
FROM dept d
JOIN locations l ON ( d.loc_id = l.id );

DNAME
CITY
-------------- -----------ACCOUNTING
NEW YORK
RESEARCH
DALLAS
OPERATIONS
BOSTON
3 rows selected.

Lista as condies de
Join aqui como na sintaxe
tradicional.

Sintaxe ANSI do Equijoin


A partir da primeira tabela do Join.
SELECT e.empno,
l.id,
Sem vrgulas entre as tabelas.
d.dname,
l.state_tx
FROM locations l
JOIN dept d ON ( d.loc_id = l.id )
JOIN emp e ON ( d.deptno = e.deptno );
EMPNO
ID DNAME
ST
---------- ---------- -------------7369
2 RESEARCH
7566
2 RESEARCH
7782
1 ACCOUNTING
7788
2 RESEARCH
7839
1 ACCOUNTING
7876
2 RESEARCH
7902
2 RESEARCH
7934
1 ACCOUNTING
8 linhas selecionadas.

-TX
TX
NY
TX
NY
TX
TX
NY

Qualquer coluna da tabela anterior


visvel - junta-se da esquerda
para a direita.
Coloque a segunda tabela do Join.

Sintaxe ANSI do Equijoin INNER


INNER uma palavra-chave

SELECT e.empno,
opcional indicando que este um
l.city,
equijoin (no um outer ou cross)
d.dname,
d.deptno
FROM locations l
INNER JOIN dept d ON ( d.loc_id = l.id )
INNER JOIN emp e ON (d.deptno = e.deptno);
EMPNO CITY
DNAME
DEPTNO
---------- ------------ -------------- ---------7369 DALLAS
RESEARCH
20
7566 DALLAS
RESEARCH
20
7782 NEW YORK
ACCOUNTING
10
7788 DALLAS
RESEARCH
20
7839 NEW YORK
ACCOUNTING
10
7876 DALLAS
RESEARCH
20
7902 DALLAS
RESEARCH
20
7934 NEW YORK
ACCOUNTING
10
8 linhas selecionadas.

Clusula ON requer referncia


para juntar colunas pelo nome
da tabela para resolver a
ambiguidade.

Parnteses so opcionais,
entretanto devemos inclu-los para
maior clareza

Sintaxe Tradicional de Outerjoin


SELECT e.ename,
d.dname
FROM emp e,
dept d
WHERE e.deptno (+) = d.deptno;
ENAME
---------CLARK
KING
MILLER
JONES
SMITH
SCOTT
FORD
ADAMS
TURNER
JAMES
ALLEN
WARD
BLAKE

DNAME
-------------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
OPERATIONS

14 linhas selecionadas.

NULL no nome se no existem


funcionrios no departamento.

Notao tradicional do Outer Join (+) o


indicador denota a expanso dos
registros deste lado, se necessrio

Sintaxe ANSI de Outerjoin


SELECT e.ename,
A palavra chave
d.dname
OUTER opcional.
FROM dept d
LEFT OUTER JOIN emp e
ON (e.deptno = d.deptno);
ENAME
---------CLARK
KING
MILLER
JONES
SMITH
SCOTT
FORD
ADAMS
TURNER
JAMES
ALLEN
WARD
BLAKE

DNAME
-------------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
OPERATIONS

14 linhas selecionadas.

Resulta NULL para os nomes de


funcionrios cujo departamento
relacionado no possui funcionrios.

O LEFT denota que a tabela dominante a da


esquerda (dept), e que todas as suas linhas sero
devolvidas. A tabela da direita expandida com
registros NULL.

Sintaxe ANSI de Outerjoin


Utilizando, por exemplo LEFT JOIN

SELECT e.ename,
emp e USING (deptno) pode ser
d.dname
usado em um INNER e OUTER join.
FROM dept d
NATURAL LEFT JOIN emp e;
ENAME
---------CLARK
KING
MILLER
JONES
SMITH
SCOTT
FORD
ADAMS
TURNER
JAMES
ALLEN
WARD
BLAKE

DNAME
-------------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
OPERATIONS

14 linhas selecionadas.

O NATURAL pode ser usado


com um INNER e OUTER join.

Sintaxe ANSI de Outerjoin


SELECT e.ename,
d.dname
FROM emp e
RIGHT OUTER JOIN dept d
ON (e.deptno = d.deptno);
ENAME
---------CLARK
KING
MILLER
JONES
SMITH
SCOTT
FORD
ADAMS
TURNER
JAMES
ALLEN
WARD
BLAKE

DNAME
-------------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
OPERATIONS

14 linhas selecionadas.

Resulta NULL para os nomes de


funcionrios cujo departamento
relacionado no possui funcionrios

O RIGHT OUTER denota que a tabela externa direita


a tabela dominante. A tabela esquerda ser ampliada
com NULOS.

Sintaxe Tradicional de Outerjoin


Full Outer Join
SELECT e.ename,
d.dname
FROM emp e, dept d
WHERE e.deptno (+) = d.deptno
UNION
SELECT e.ename,
d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno (+);
ENAME
---------ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD

DNAME
-------------RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
SALES
RESEARCH
ACCOUNTING

ACCOUNTING
RESEARCH
RESEARCH
SALES
SALES
OPERATIONS
15 linhas selecionadas.

UNION ALL incorreto, uma vez


que resulta em linhas duplicadas.
O UNION realiza um "DISTINCT"
implcito no resultado que a
remoo de linhas duplicadas.
Esta sintaxe de join full" tambm
conhecida como true" full join.

Tradicional Full Join - True


SELECT e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno(+)
UNION ALL
SELECT NULL, d.dname
FROM dept d
WHERE NOT EXISTS
(SELECT 1
FROM emp e
WHERE e.deptno = d.deptno)
ENAME
---------ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD

DNAME
-------------RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
SALES
RESEARCH
ACCOUNTING

ACCOUNTING
RESEARCH
RESEARCH
SALES
SALES
OPERATIONS
15 linhas selecionadas.

Outer join da tabela emp com a


tabela dept - todas as linhas da
tabela emp agora voltaram.
Use a clusula UNION ALL para
evitar o DISTINCT implcito
inerente UNIO.
Adicionar linhas da tabela dept
que no tm relao com emp.

Sintaxe ANSI de Outerjoin


Full Outer Join
SELECT e.ename,
d.dname
FROM emp e
FULL OUTER JOIN dept d
ON (e.deptno = d.deptno);
ENAME
---------ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD

DNAME
-------------RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
SALES
RESEARCH
ACCOUNTING

ACCOUNTING
RESEARCH
RESEARCH
SALES
SALES
OPERATIONS
15 linhas selecionadas.

NULL no ltimo nome se no existem


funcionrios no departamento.
NULL no nome do departamento se o
departamento no possui
funcionrios.
OUTER opcional
O FULL OUTER denota que todos os
registros da tabela direita e todos os
registros da tabela esquerda tero
seus registros retornados.

O Produto Cartesiano Tradicional


Cross Join/Cross Product
SELECT empno,
ename,
dname
FROM emp e,
dept d
WHERE d.deptno = 10;
EMPNO
ENAME
---------- ---------7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
14 rows selected.

DNAME
-------------ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING

Cruzamentos inadvertidos ocorrem


e no so bvios se a tabela
juntada possui uma nica linha.
Sem condio de join entre as
tabelas.

O Cross Join ANSI


Cross Product
SELECT empno,
ename,
dname
FROM emp e
CROSS JOIN dept d
WHERE d.deptno = 10;
EMPNO ENAME
DNAME
---------- ---------- -------------7369 SMITH
ACCOUNTING
7499 ALLEN
ACCOUNTING
7521 WARD
ACCOUNTING
7566 JONES
ACCOUNTING
7654 MARTIN
ACCOUNTING
7698 BLAKE
ACCOUNTING
7782 CLARK
ACCOUNTING
7788 SCOTT
ACCOUNTING
7839 KING
ACCOUNTING
7844 TURNER
ACCOUNTING
7876 ADAMS
ACCOUNTING
7900 JAMES
ACCOUNTING
7902 FORD
ACCOUNTING
7934 MILLER
ACCOUNTING
14 rows selected.

Condio CROSS explcita ...


impossvel fazer isso acidentalmente.

Join Correlato ANSI


SELECT empno,
ANSI no permite clusula
ename
de Join na primeira tabela.
FROM emp e
WHERE EXISTS
( SELECT NULL
Somente as tabelas na clusula
FROM dept d
FROM corrente visvel para a
INNER JOIN locations l
lgica de join ANSI
ON ( l.id = d.loc_id )
WHERE d.deptno = e.deptno
);
EMPNO ENAME
No realmente uma
---------- ---------sintaxe de mixed join
7369 SMITH
7566 JONES
7782 CLARK
7788 SCOTT
7839 KING
7876 ADAMS
7902 FORD
7934 MILLER
8 linhas selecionadas.

Sutilezas do Outer Join ANSI


SELECT d.deptno, e.ename, e.job
FROM dept d
LEFT JOIN emp e
ON (
e.deptno = d.deptno
AND e.job = 'SALESMAN');
DEPTNO ENAME
JOB
---------- ---------30 ALLEN
30 WARD
30 TURNER
40
20
10

--------SALESMAN
SALESMAN
SALESMAN

6 linhas selecionadas.
Apenas o departamento 30, SALES,
tem SALESMAN como um trabalho.

O filtro aplicado antes


do join ser executado.

Um nmero de linhas retornadas que


foram juntadas no OUTER" com os
dados da tabela emp.

Sutilezas do Outer Join ANSI


select d.deptno,e.ename,e.job
from dept d
left join emp e
on (e.deptno = d.deptno)
where e.job = 'SALESMAN';
DEPTNO
---------30
30
30
30

ENAME
---------ALLEN
WARD
MARTIN
TURNER

3 rows selected.

JOB
--------SALESMAN
SALESMAN
SALESMAN
SALESMAN

O filtro aplicado aps


o join ser executado.

No existem dados da tabela outer.

A condio efetivamente converteu esta


query OUTER JOIN em um INNER JOIN.

Misturando os Joins Tradicional e ANSI


SELECT empno,
ename,
dname
FROM emp e
INNER JOIN dept d USING (deptno)
WHERE deptno = 10;
EMPNO ENAME
DNAME
---------- ---------- -------------7782 CLARK
ACCOUNTING
7839 KING
ACCOUNTING
7934 MILLER
ACCOUNTING

Misturando as Sintaxes
SELECT empno,
ename,
dname,
dummy
FROM dual,
emp e
INNER JOIN dept d ON (d.deptno = e.deptno)
WHERE e.deptno = 10;
EMPNO
---------7782
7839
7934

ENAME
---------CLARK
KING
MILLER

3 rows selected.

DNAME
-------------ACCOUNTING
ACCOUNTING
ACCOUNTING

D
X
X
X

Misturando as Sintaxes
SELECT empno,
ename,
dname,
dummy
FROM emp e
dual,
INNER JOIN dept d
ON ( d.deptno = e.deptno )
WHERE e.deptno = 10;
dual,
*
ERROR at line 6:
ORA-00933: SQL command not properly ended

Misturando as Sintaxes
SELECT empno, ename, dname, dummy
Presena de ambas: a vrgula
(tradicional) e a sintaxe JOIN
FROM dual,
emp e
INNER JOIN dept d on d.deptno = e.deptno
and dummy IS NOT NULL
WHERE e.deptno = 10;
ANSI s pode ver outras tabelas
que participam no Join ANSI

and dummy IS NOT NULL


*
ERROR at line 8:
ORA-00904: "DUMMY": invalid identifier

Perguntas?

33

Potrebbero piacerti anche