连接sql中的表,如果存在table2中table1中不存在的值

时间:2015-10-06 20:16:28

标签: sql sql-server reporting-services

所以我之前有这个问题,但我仍然在努力解决这个问题。没有多少工作,但我会再次尝试看看有人在这里看到我正在迅速做出的错误可以回复。所以我有table1(employeetimesheets)和table2(projectname)。 我想要完成的是将table2(projectname)中的projectname列连接到table1(employeetimesheets)中的每个雇员,即使记录不存在。 table1和table2之间的关系是< em> table2.pkid = table1.abbrevjob-2 和所有的缩写&gt; 11是自定义项目。 正如我们在表1中看到的那样,员工只有他们记录时间的数据,但是我想获取那里的所有数据并将其与table2.projectname连接以完成所有不是的abbrevjob-2那里。(我希望这是有道理的)。下面我展示了所需结果应该是什么样的片段。 除了缺少的员工列之外,empid = 2应该包含其所有数据以及项目名称中缺少的所有数据,我已在下面显示。到目前为止,我已经尝试了从Case语句到if存在的各种事情,但到目前为止还没有运气。请帮忙解决一些问题。 我想要的是每个员工拥有项目名称,即使他们没有记录任何值。想象一下,作为9个静态行(项目名称)的时间表,然后是每个员工正在处理的其他项目或工作。所以在ssrs中,当我设计ssrs报告时,每个员工将自动拥有9个与项目名称相对应的静态行,其余的将是他们所处理的任何工作。静态行应该仍然显示,即使它们没有任何时间(值)。 desired results table1 Table2

queries

trial1

会显示左连接的建议查询 results to the suggested query for left join

enter image description here

这是我的ssrs报告最后应该是什么样子的一个例子

3 个答案:

答案 0 :(得分:1)

我不确定你在做什么,但我会使用 CROSS JOIN 来获取每个项目的所有员工的列表。

SELECT DISTINCT Employee, project  
FROM projectname
CROSS JOIN employeetimesheets 

然后将其余查询加入到此处。

我摆弄了你的SQLFiddle

答案 1 :(得分:1)

我认为这就是你想要的,我相信甲骨文他们称之为“致密化”。您的数据未规范化,并且您与empid值重复。很难弄清楚你需要什么,但这应该是一个开始。

select e.EmpId, p.pkid, e.Employee, p.project, ets.Day
from
    projectname as p
    cross join
    /* do you have an employees table? */
    (select distinct EmpId, Employee from employeetimesheets) as e
    left outer join
    employeetimesheets as ets
        on ets.projectnames = p.project
            and ets.Empid = e.Empid
order by e.EmpId, p.pkid, ets.Day

如果您可以假设至少有一名员工已经为您所在范围内的每个日期填写了一个条目,那么您就不必“密集”您输出的那个维度。 (SSRS会为你填写矩阵。)如果没有,那么你还有一些工作要做,但这是一个类似的想法。您可能希望填充日历日期表以使其更容易。

http://sqlfiddle.com/#!6/3efa6/15

这个想法的核心是您创建项目,员工和日期的所有可能组合。您无法知道数据表中缺少哪些组合,并且数据库服务器没有预定义的方法为您提供任何缺失值。这为您的报告提供了模板。

获得后,然后使用外连接附加数据。如果没有数据,则会留下一个null,表示矩阵中的空单元格。

答案 2 :(得分:0)

您需要使用LEFT JOIN。如果您有两个表,tab_onetab_two,并且您希望在表之间加入共享列,但保留tab_onetab_twotab_one LEFT JOIN tab_two中没有匹配条目的所有值{1}},您使用SELECT * FROM projectname p LEFT JOIN employeetimesheets e ON p.pkid = e.abbrevjob - 2;

因此,如果不使用特定列,您可以使用:

 data[undefined][player_nickname]:Leon

供您查询。