如何从两个SQL表中获取列

如何从两个SQL表中获取列,sql,Sql,我创建了一个包含多个表的数据库 与我的问题相关的表格: 剖面表 存储所有文件 工资组表 储存所有的薪水 简介工薪阶层 存储连接的配置文件和薪资 我有几个存储过程可以插入配置文件/薪资等。我有一个过程可以连接配置文件和薪资,并将它们存储在“profileSalaryGroups”表中。 我还有一个程序,可以获取与特定个人资料相关的所有工资 这些程序执行以下操作: 连接配置文件和薪资程序(工作正常): 获取连接到特定配置文件的所有薪资(工作正常): 问题: 我试图创建一个程序,让我得到所有的工薪Id

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

与我的问题相关的表格:

剖面表 存储所有文件

工资组表 储存所有的薪水

简介工薪阶层 存储连接的配置文件和薪资

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

这些程序执行以下操作:

连接配置文件和薪资程序(工作正常):

获取连接到特定配置文件的所有薪资(工作正常):

问题:

我试图创建一个程序,让我得到所有的工薪Id和姓名,而不是 已连接到配置文件

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

SELECT SalaryGroupId, s.Name from ProfileSalaryGroups ps
    INNER JOIN SalaryGroup as s on s.Id = ps.SalaryGroupId
    Where ps.ProfileId != @ProfId
这让我得到了一半我想要的东西。我想获取所有未连接到此配置文件的薪资,但此代码返回所有与配置文件有连接但未作为参数发送的薪资Id和名称,它不包括“SalaryGroup”表中存在的所有薪资

结果一无所获

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

如果标题不正确,那么我很抱歉,但我不知道如何理解这个问题的标题。如果@Admin有更好的标题,请随意更改


谢谢大家!

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

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不为null的位置)

左侧外部联接应该执行您想要的操作:

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为空
选择那些根本没有配置文件的,而
prof.ProfileId!=@ProfId
选择那些拥有配置文件但与当前配置文件不匹配的人。

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

首先,得到所有的薪水

select * 
from SalaryGroup s
left join ProfileSalaryGroup ps on ps.salaryGroupID=s.ID
现在,您不想全部使用它们,所以请寻找消除其中一些的方法。
要消除与参数匹配的组,请添加where子句

where ps.profileID <> @parameter

左连接(而不是内部连接)告诉SQL始终返回一行,不管第二个表中是否有匹配的数据。如果SQL没有找到匹配项,则第二个表中的数据列都将为NULL。WHERE子句的第一部分仅返回与参数不匹配的行。第二部分返回没有配置文件薪资数据的行

将您的参数作为左联接的条件,并在WHERE子句中检查
ps.SalaryGroupId为NULL

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

这很复杂:D。请细化你的问题。好的,基本上我需要获得工资Id和那些没有连接到特定个人资料的工资的名称。示例:在html页面上,您装箱了一个名为“test”的配置文件,该配置文件的id为nr5。我将此id号作为参数发送到我的程序,并希望获取所有未连接到id号为5的配置文件的工资的名称和id,在本例中,这将是所有的工资,因为新的配置文件将刚刚创建,并且没有连接到任何工资。profileId不存在于SalaryGroup check pic中:尽管如此,一般方法应该可以解决您的问题。我对SQL进行了一些修改,希望它能正常工作。我在问题中描述的第一次尝试使我得到了所有与我作为参数拥有的配置文件有关联但与之无关的薪水。你提供给我的代码让我得到了谜题的另一半。。。它给了我所有的薪水,而这些薪水和以前没有任何关系。我需要有一个连接到配置文件的配置文件,但不需要作为参数的配置文件,也需要一个没有连接的配置文件,这是什么ever@user1862808,在这种情况下,您可以同时使用这两个条件。查看更新。测试了几次仅2确保它工作完美!谢谢如果你能友好地解释最后几行代码,我将不胜感激!看看SQL联接的可视化表示。特别是在左侧,不包括JOIN
select * 
from SalaryGroup s
left join ProfileSalaryGroup ps on ps.salaryGroupID=s.ID
where ps.profileID <> @parameter
and ps.ProfileID is NULL
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