2

我创建了一个包含多个表的数据库。

与我的问题相关的表格:

配置文件表 http://imageshack.us/photo/my-images/838/profileqw.jpg/ 存储所有 porfiles

SalaryGroup 表 http://imageshack.us/photo/my-images/255/salarygroup.jpg/ 存储所有工资

ProfileSalaryGroups http://imageshack.us/photo/my-images/138/profileandsalary.jpg/ 存储连接的个人资料和薪水

我有几个插入配置文件/薪水等的存储过程。我有一个连接配置文件和薪水并将它们存储在“profileSalaryGroups”表中的过程。我还有一个程序可以获取与特定配置文件相关的所有薪水。

这些过程执行以下操作:

连接个人资料和工资程序(完美运行):

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

获取与特定配置文件相关的所有薪水(完美运行):

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

问题:

我正在尝试创建一个程序来获取所有未连接到个人资料的工资 ID 和姓名。

我已经尝试了几种方法,例如:

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

这让我得到了我想要的一半。我想获取所有未连接到此配置文件的薪水,但此代码返回我所有与配置文件有连接但不与我作为参数发送的薪水 ID 和名称,它不包括所有“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
    )

这什么也没返回。

我已经有一段时间了,并尝试了其他几种方法(在某些情况下可笑),但我被困住了,如果需要更多信息,请询问,我会尽力提供。

如果标题不正确,我很抱歉,但我不知道该问题的标题是什么。如果@Admin 有更好的标题,请随时更改它。

谢谢!

4

4 回答 4

0

您可以使用左连接来执行此操作,并查找连接右侧没有结果的位置:

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

这应该得到所有的工资 id 和名称,但删除 SalaryGroup 中匹配记录的位置(即 s.profileId 不为空的位置)

于 2013-02-28T11:07:18.663 回答
0

左外连接应该做你想做的事:

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

说明: whereprof.Id is null选择完全没有 profile 的,whileprof.ProfileId != @ProfId选择有 profile 但与当前不匹配的。

于 2013-02-28T11:10:21.790 回答
0

从简单开始,解决您的问题。

首先,获取所有的salaryID

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

现在,您不想要所有这些,因此请考虑消除其中一些的方法。
要消除与参数匹配的组,请添加 where 子句

where ps.profileID <> @parameter

现在,如果您想在不匹配 Profiles 和以下内容的情况下消除薪金组

and ps.ProfileID is NULL

左连接(而不是 INNER JOIN)告诉 SQL 总是返回一行,无论第二个表中是否有匹配的数据。如果 SQL 未找到匹配项,则第二个表中的数据列将全部为 NULL。WHERE 子句的第一部分只返回与参数不匹配的行。第二部分返回没有 Profile Salary 数据的行

于 2013-02-28T11:10:40.637 回答
0

将您的参数作为 LEFT JOIN 的条件并签ps.SalaryGroupId IS NULL入 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
于 2013-02-28T11:17:37.213 回答