ORACLE: plusieurs colonne de sous-requêtes
C'est à partir de la Base de données Oracle 10g: SQL Fundamentals.
Original Oracle manuel.
Francly parlant, tout cela est réel jusqu'à présent.
Il est une tâche qui me troublent:
Afficher le nom de famille, nom du département, et le salaire d'un employé dont le salaire et commission correspondre au salaire et à la commission de nombreuses employé situé dans un emplacement ID 1700.
Le sujet pour être appris, c'est à plusieurs colonnes sous-requêtes. Cela signifie que nous ne pouvons pas s'écarter de l'offre de modèle:
SELECT column, column, ...
FROM table
WHERE (column, column, ...) IN
(SELECT column, column, ...
FROM table
WHERE condition);
Bien, ma base de données:
describe employees
Name Null Type
-------------- -------- ------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
describe departments
Name Null Type
--------------- -------- ------------
DEPARTMENT_ID NOT NULL NUMBER(4)
DEPARTMENT_NAME NOT NULL VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)
Il existe une solution:
select
e.last_name,
d.department_name,
e.salary
from employees e, departments d
where e.department_id = d.department_id
and (salary, nvl(commission_pct, 0)) in
(select salary, nvl(commission_pct, 0)
from employees e, departments d
where e.department_id = d.department_id
and d.location_id = 1700);
SÉLECTIONNÉ 36 LIGNES.
Bien, j'ai commencé à vérifier. Il semble que les employés de l'emplacement de 1700 dupliqué contre eux-mêmes.
Regardez: nous prenons l'ensemble de la liste des employés et puis juxtaposer avec les employés de l'emplacement de 1700. Bien sûr, il y aura des doublons.
J'ai préparé un fichier excel avec des données (tous les employés, les employés de l'emplacement de 1700, le résultat de mes propres résultat souhaité, etc.). Dans le fichier, il est plus pittoresque, avec des exemples et ainsi de suite. S'il vous plaît, jetez un oeil.
C'est le fichier: https://skydrive.live.com/redir?resid=8CDFFBA921B002FE!150&authkey=!ADMRAE466BIunQM
Bien, ce que je voudrais faire est de contrôler qu'aucun employé n'est par rapport à eux-mêmes.
C'était ma variante bevore j'ai vérifié la solution.
select lnme, dpt, slry
from
(
select
employee_id eid,
last_name lnme,
salary slry,
nvl(commission_pct,0) cpct,
d.department_name dpt,
location_id
from employees e
left join departments d
on e.department_id = d.department_id
)
where (slry, cpct) in
(select
employee_id ide,
salary slry,
nvl(commission_pct,0) cpct
from employees e
join departments d
on e.department_id = d.department_id and location_id = 1700)
and ide <> eid
Je voulais m'assurer qu'aucun employé est comparé avec le même salarié. Mais j'ai échoué.
Pourriez-vous commenter tous cette situation:
1. Si je suis complètement faux et la solution d'Oracle est parfait.
2. Si Oracle est mal, pourriez-vous m'aider avec ce code?
Vous en remercie d'avance.
Vous devez vous connecter pour publier un commentaire.
La question vous demande de vous identifier tout employé dont le salaire et la commission correspond à une combinaison de salaire et le salaire des employés dans le Département de 1700. La question ne veut pas dire exclure les employés de ce ministère. Donc, il est tout à fait correcte pour qu'ils apparaissent dans le jeu de résultats.
Vous n'êtes pas correspondant à vos employés, vous êtes correspondant à salaires . Il se trouve que la liste des salaires est généré à partir d'une sous-requête du ministère 1700: il pourrait tout aussi bien être une liste de nombres à partir d'un fichier CSV.
Nous allons avoir une expérience de pensée. Il y a trois employés dans le département de 1700:
Personne d'autre dans l'entreprise gagne au-dessus de 10K.
Quelle est donc la réponse à la question: combien d'employés ont un salaire et de la commission, qui correspondent au salaire et à la commission de tout employé située dans le département de 1700?
Puis Joe obtient une modeste augmentation, et les salaires ressembler à ceci:
Quelle est donc la réponse à la même question maintenant?
La réponse est "trois" dans les deux cas.
Pourquoi?
Parce que SQL est un langage de programmation basé sur, et de l'ensemble des employés qui gagnent le salaire exact et de la commission en tant qu'employés dans le département de 1700 doit inclure tous les employés qui travaillent dans le département de 1700.
Il y a un autre ensemble, qui est l'ensemble de tous les employés qui gagnent le salaire exact et de la commission en tant qu'employés dans le département de 1700 qui n'ont pas eux-mêmes dans le département de 1700. Mais ce n'est pas le jeu le SQL les Fondamentaux quiz est à la recherche d'.
... AND e.department_id != 1700
.