2 votes

Comment obtenir les colonnes de deux tables SQL

J'ai créé une base de données qui comporte plusieurs tables.

les tables qui sont pertinentes pour mon problème :

Tableau des profils http://imageshack.us/photo/my-images/838/profileqw.jpg/ Stocke tous les porfiles

Table SalaryGroup http://imageshack.us/photo/my-images/255/salarygroup.jpg/ Stocke tous les salaires

ProfileSalaryGroups http://imageshack.us/photo/my-images/138/profileandsalary.jpg/ Stocke les profils et les salaires qui sont connectés

J'ai plusieurs procédures stockées qui insèrent des profils/salaires, etc. J'ai une procédure qui relie les profils et les salaires et les stocke dans la table "profileSalaryGroups". J'ai également une procédure qui récupère tous les salaires qui sont liés à un profil spécifique.

Ces procédures effectuent les opérations suivantes :

Connecte les profils et la procédure des salaires (fonctionne parfaitement) :

ALTER PROCEDURE [dbo].[ConnectProfileAndSalary]
    -- Add the parameters for the stored procedure here
    @ProfileName varchar(50) = '', 
    @Salaryname varchar(50) = ''
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    DECLARE @pId int
    DECLARE @sId int
    SELECT @pId =  Id from [Profile] where Name = @ProfileName
    SELECT @sId =  Id from SalaryGroup where Name = @Salaryname

    -- If the Id number already exists
    IF ((SELECT COUNT(*) FROM ProfileSalaryGroups WHERE SalaryGroupId = @sId) > 0 OR
        (SELECT COUNT(*) FROM ProfileSalaryGroups WHERE ProfileId = @pId) > 0)  
        RAISERROR ('Connection Exists', -- Message text.
                    16, -- Severity.
                    1 )
    ELSE
    INSERT INTO ProfileSalaryGroups (SalaryGroupId,ProfileId ) VALUES (@sId, @pId)
END

Récupère tous les salaires qui sont liés à un profil spécifique (fonctionne parfaitement) :

ALTER PROCEDURE [dbo].[GetConnectedSalaries]
    -- Add the parameters for the stored procedure here
    @ProfId int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT SalaryGroupId, s.Name from ProfileSalaryGroups ps
    INNER JOIN SalaryGroup as s on s.Id = ps.SalaryGroupId
    Where ps.ProfileId = @ProfId
END

Problème :

J'essaie de créer une procédure qui me donne tous les noms et les numéros d'identification des salariés qui ne sont PAS dans la base de données. connectés à un profil.

J'ai essayé plusieurs approches à ce sujet, par exemple :

SELECT SalaryGroupId, s.Name from ProfileSalaryGroups ps
    INNER JOIN SalaryGroup as s on s.Id = ps.SalaryGroupId
    Where ps.ProfileId != @ProfId

ça m'apporte la moitié des choses que je veux. Je veux obtenir TOUS les salaires qui ne sont pas connectés à ce profil mais ce code me renvoie tous les Id et noms de salaires qui ont une connexion avec un profil mais pas avec celui que j'ai envoyé comme paramètre, il n'inclut pas tous les salaires qui existent dans la table "SalaryGroup".

SELECT s.Id, s.Name from SalaryGroup s
    where NOT EXISTS (SELECT SalaryGroupId, s.Name, s.Id from ProfileSalaryGroups ps
    INNER JOIN SalaryGroup as s on s.Id = ps.SalaryGroupId
    Where ps.ProfileId = 17
    )

Cela n'a rien donné.

J'y travaille depuis un certain temps et j'ai tenté plusieurs autres approches (parfois risibles) et je suis coincé. Si vous avez besoin de plus d'informations, demandez-les et je ferai de mon mieux pour vous les fournir.

Si le titre n'est pas correct, je suis désolé mais je ne savais pas quoi faire du titre de ce problème. Si @Admin a un meilleur titre en tête, n'hésitez pas à le modifier.

Merci !

0voto

Robin Points 1798

Vous pouvez le faire avec une jointure gauche et rechercher les endroits où le côté droit de la jointure n'a pas de résultats :

SELECT 
  s.Id, 
  s.Name 
from SalaryGroup  s
left JOIN ProfileSalaryGroups as ps 
on s.Id = ps.SalaryGroupId
Where ps.SalaryGroupId is null

Cela devrait permettre tous les identifiants et les noms de salaire, mais supprimez ceux qui correspondent à un enregistrement dans SalaryGroup (c'est-à-dire ceux pour lesquels s.profileId n'est pas nul).

0voto

La jointure extérieure gauche devrait faire ce que vous voulez :

select * 
   from SalaryGroup sal
   left outer join ProfileSalaryGroups prof on
        prof.Id = sal.Id
   where prof.Id is null or prof.ProfileId != @ProfId

Explication :prof.Id is null sélectionne ceux qui n'ont aucun profil, tandis que prof.ProfileId != @ProfId sélectionne ceux qui ont un profil mais qui ne correspondent pas au profil actuel.

0voto

Sparky Points 9253

Commencez simplement et progressez jusqu'à votre problème.

D'abord, récupérez tous les salaryID's

select * 
from SalaryGroup s
left join ProfileSalaryGroup ps on ps.salaryGroupID=s.ID

Maintenant, vous ne les voulez pas tous, alors cherchez des moyens d'en éliminer certains
Pour éliminer les groupes correspondant au paramètre, ajoutez une clause "where".

where ps.profileID <> @parameter

Maintenant, si vous voulez éliminer les salaryGroups sans correspondance avec les Profils et ce qui suit

and ps.ProfileID is NULL

La jointure gauche (plutôt que INNER JOIN) indique à SQL de toujours renvoyer une ligne, qu'il y ait ou non des données correspondantes dans la deuxième table. Si SQL ne trouve pas de correspondance, les colonnes de données de la deuxième table seront toutes NULL. La première partie de la clause WHERE renvoie uniquement les lignes ne correspondant pas au paramètre. La deuxième partie renvoie les lignes ne contenant aucune donnée de salaire de profil.

0voto

Alexander Fedorenko Points 7526

Mettez votre paramètre comme condition pour LEFT JOIN et vérifiez. ps.SalaryGroupId IS NULL dans la clause WHERE

SELECT s.Id, s.Name 
FROM SalaryGroup as s LEFT JOIN ProfileSalaryGroups ps on s.Id = ps.SalaryGroupId
                                  AND ps.ProfileId = @ProfId
WHERE ps.SalaryGroupId IS NULL

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X