2012-06-18 6 views
-2

J'ai deux requêtes de sélection à utiliser dans mon projet pour obtenir des données et les afficher dans ma page Web. Je veux les rejoindre de sorte que je n'ai besoin d'accéder aux données qu'une seule fois. Mais je ne sais pas comment les joindre car l'une des requêtes contient la fonction de groupe. Pourriez-vous m'aider? Merci d'avance.Joindre deux requêtes

Répondre

1

Une façon de résoudre ce problème serait de faire le travail en plusieurs étapes. Avant de joindre le jeu de résultats à la requête, vous devez l'enregistrer dans une variable de table ou de table temporaire. (Une table temporaire peut être préférable si vous attendez un grand jeu de résultats.)

Fondamentalement, votre requête changerait quelque chose comme ceci:

/* prepare the storage */ 
IF OBJECT_ID('tempdb..#sp_results') IS NOT NULL 
    DROP TABLE #sp_results; 
CREATE TABLE #sp_results (
    /* the types may be wrong, please modify as necessary */ 
    currency_cd int, 
    salary decimal(10,2) 
); 

/* save the results of the SP */ 
INSERT INTO #sp_results 
EXEC SP_namearguments… 

/* use the saved results in your query */ 
SELECT 
    your present columns, 
    tmp.currency_cd, 
    tmp.salary 
FROM 
    your present joins 
    LEFT OUTER JOIN #sp_results AS tmp ON a proper join condition 
; 

Le problème est, cependant, votre SP est conçu pour renvoie les résultats pour un employé individuel alors que la requête semble récupérer des données pour plusieurs employés. Pour résoudre le problème, vous pouvez ajouter une colonne employee_code à la table temporaire et obtenir/enregistrer les résultats pour chaque employé un par un, dans un curseur, en utilisant une boucle.

Mais ce serait probablement l'un des pire exemples d'utilisation d'un curseur. Une meilleure alternative pourrait consister à créer une vue de retourner les mêmes données que votre SP, mais pour tous employés:

CREATE VIEW employees_compensation_view 
AS 
SELECT 
    employee_code, 
    currency_cd, 
    SUM(comprate) AS salary 
FROM employees_compensation 
GROUP BY 
    employee_code, 
    currency_cd 

alors vous pourrez juste pour se joindre à la vue de votre requête, comme ceci:

SELECT 
    your present columns, 
    ecv.currency_cd, 
    ecv.salary 
FROM 
    your present joins 
    LEFT OUTER JOIN employees_compensation_view AS ecv 
    ON b.employee_code = ecv.employee_code 
; 

Pour une meilleure encapsulation de votre logique métier, vous pouvez également modifier la requête de cette procédure stockée comme:

SELECT 
    currency_cd, 
    salary 
FROM employees_compensation_view 
WHERE employee_code = @emp_code 

C'est, si vous avez toujours besoin de ce SP.

+1

Merci. J'ai créé le fichier employees_compensation_view et je l'ai joint à ma requête. –