MySql

2017-02-26 3 views
0
mise en œuvre des sous-requêtes Corrélés

Pour la requête ci-dessous:MySql

SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT Salary) FROM Employee p 
      WHERE e.Salary<=p.Salary) 

Si pas la condition e.salary<=p.salary dans la sous-requête est irréversible. Nous devrions comparer la colonne p.salary avec la colonne e.salary de la requête externe à plusieurs reprises et donc p.salary doit être sur le côté gauche. S'il vous plaît laissez-moi savoir si ma compréhension est erronée. PS: la requête ci-dessus tente de trouver le deuxième salaire le plus élevé de la table Employé.

Modifier: Le problème semble être dans ma compréhension. J'ai mentionné ci-dessous comment je pense que la requête peut être exécutée:

Disons que nous avons une table Employé avec 4 salaires 10,20,30,40. Maintenant, les enregistrements commencent à être traités un par un. Donc, nous obtenons en quelque sorte les 4 implémentations intermédiaires suivantes:

`code` 
SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary) 
      FROM Employee p 
      WHERE 10<=p.salary -- record with salary 10 
     ); 
SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary) 
      FROM Employee p 
      WHERE 20<=p.salary 
     ); 
SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary) 
      FROM Employee p 
      WHERE 30<=p.salary 
     ); 
SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary) 
      FROM Employee p 
      WHERE 40<=p.salary 
     ); 
`code` 

Cette commande est-elle correcte? Est-ce que la colonne que nous essayons de comparer ne doit pas être sur le côté gauche comme p.salary>=e.salary?

+0

Quelle base de données utilisez-vous? – GurV

+0

Cette requête me semble correcte. Avez-vous un problème réel? –

+0

La condition dans la clause 'WHERE' dit compter le nombre de salaires qui sont> = la ligne actuelle, et assurez-vous que ce nombre est = 2 ... en d'autres termes, prendre le deuxième salaire le plus élevé. –

Répondre

1

C'est la requête:

SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary) 
      FROM Employee p 
      WHERE e.Salary <= p.Salary 
     ); 

Elle compte le nombre de distincts des salaires qui sont supérieurs ou égaux au salaire d'un employé donné. C'est-à-dire que la requête calcule les deuxièmes plus importantes prises en compte de salaire. Si vous "inversez" les conditions, vous ferez autre chose.

Dans la plupart des bases de données, vous pouvez l'exprimer en utilisant dense_rank() au lieu d'un sous-requête corrélative:

SELECT Id, Salary 
FROM (SELECT e.*, 
      DENSE_RANK() OVER (ORDER BY e.salary) as dr 
     FROM Employee e 
    ) e 
WHERE dr = 2; 
+0

Je suppose que j'ai besoin de travailler à nouveau sur la logique. Dis que nous avons une table Employé avec 4 salaires 10,20,30,40. Maintenant, les enregistrements commencent à être traités un par un. Nous obtenons donc des types 4 implémentations intermédiaires suivants: SELECT Id, Salaire de l'employé e OU 2 = (SELECT COUNT (DISTINCT p.Salary) de l'employé p OÙ e.Salary <= 10 ); – Ronald

+0

vérifiez la question s'il vous plaît. J'ai modifié la question – Ronald