2013-02-28 33 views
2

我创建了一个包含多个表的数据库。如何从两个表中获取colums SQL

档案表 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”表中。 我也有一个过程,可以获取连接到特定配置文件的所有工资。

这些prrocedures执行以下步骤:

连接型材&薪金程序(工作完全):

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 

问题:

我想创建一个程序,让我所有的salarie 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 
    ) 

这没有任何返回。

Iv'e一直在这一段时间,并尝试了其他几种方法(在某些情况下可笑),我卡住了,如果需要更多的信息,然后问,我会尽我所能来提供它。

如果标题不正确,那么我很抱歉,但我不知道该如何解决这个问题。如果@Admin有一个更好的标题,随时可以改变它。

谢谢!

+0

这是复杂ps.SalaryGroupId IS NULL:d。请优化您的问题。 – 2013-02-28 11:03:44

+0

基本上,我需要获得未连接到特定配置文件的薪金ID和薪资名称。例如: 在html页面中,您创建了一个名为“test”的配置文件 此配置文件获取了编号为5的编号。 我将此编号作为参数发送给我的过程,并希望获取所有这些工资的名称和ID没有连接到ID为5的个人资料,在这个例子中,这将是所有的薪水,因为新的个人资料只是已经创建,并没有连接到任何薪水。 – ThunD3eR 2013-02-28 11:09:13

回答

0

把你的参数作为条件LEFT JOIN并为您在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 
+0

测试这几次只是2确保它完美的作品!谢谢! 如果你会友好并解释代码的最后几行我会很棒! – ThunD3eR 2013-02-28 12:04:43

+1

看SQL加入的视觉表示http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins。特别在左侧排除JOIN – 2013-02-28 12:35:34

0

您可以用左这样做加盟,寻找其中的加入右侧一直没有结果:

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

这应该让所有工资编号和名称,但除去那里在SalaryGroup匹配的记录(即其中s.profileId不为null)

+0

profileId不存在SalaryGroup 检查图片: http://imageshack.us/photo/my-images/255/salarygroup.jpg/ – ThunD3eR 2013-02-28 11:12:59

+0

公平的,一般的方法应该为你的问题工作,虽然。我修改了一下SQL,希望能够工作 – Robin 2013-02-28 11:15:44

0

LEFT OUTER JOIN应该做你想要什么:

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

说明:其中prof.Id is null选择那些根本没有配置文件,而prof.ProfileId != @ProfId选择那些有一个配置文件,但不匹配当前的配置文件。

+0

我在我的问题中描述的第一次尝试让我获得了所有的薪水,但是没有作为参数的配置文件。 你给我提供的代码让我获得了另一半的难题......它让我获得了所有薪水,但没有任何联系。 我需要两个都有一个连接到配置文件,但不是我有作为参数的配置文件和那些没有连接什么那么从来没有一个连接 – ThunD3eR 2013-02-28 11:21:03

+0

@ user1862808,在这种情况下,你可以使用这两种条件。查看更新。 – 2013-02-28 11:28:07

0

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

首先,让所有salaryID的

现在,你不想让他们所有,所以看的方法来消除其中的一些..
为了消除参数匹配组,添加where子句

where ps.profileID <> @parameter 

现在,如果你想消除salaryGroups没有匹配型材及以下

and ps.ProfileID is NULL 

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

相关问题