Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将sql中的表与表2中表1中不存在的值的if exists联接_Sql_Sql Server_Reporting Services - Fatal编程技术网

将sql中的表与表2中表1中不存在的值的if exists联接

将sql中的表与表2中表1中不存在的值的if exists联接,sql,sql-server,reporting-services,Sql,Sql Server,Reporting Services,所以我以前有过这个问题,但我仍在为此苦苦挣扎。虽然没什么效果,但我会再次尝试,看看是否有人看到了我正在犯的错误,可以很快作出回应。所以我有表1(员工时间表)和表2(项目名称)我试图实现的是将表2(项目名称)中的项目名称列连接到表1(员工时间表)中的每个员工,即使记录不存在。表1和表2之间的关系是表2。pkid=table1。abbrevjob-2所有abbrevjob>11都是自定义项目。 正如我们在表1中所看到的,员工只有他们登录的数据,但我想获取那里的所有数据,并将其与table2.proj

所以我以前有过这个问题,但我仍在为此苦苦挣扎。虽然没什么效果,但我会再次尝试,看看是否有人看到了我正在犯的错误,可以很快作出回应。所以我有表1(员工时间表)和表2(项目名称)我试图实现的是将表2(项目名称)中的项目名称列连接到表1(员工时间表)中的每个员工,即使记录不存在。表1和表2之间的关系是表2。pkid=table1。abbrevjob-2所有abbrevjob>11都是自定义项目。
正如我们在表1中所看到的,员工只有他们登录的数据,但我想获取那里的所有数据,并将其与table2.projectname合并,以完成所有不在那里的abbrevjob-2。(我希望这是有意义的)。下面,我将展示一个期望结果的片段除了缺少employee列之外,empid=2应该包含其所有数据,以及我在下面显示的projectname中缺少的所有数据。到目前为止,我已经尝试了各种各样的事情,从案例陈述到if exists,但到目前为止没有运气。请帮我弄点东西我希望每个员工都有项目名称,即使他们没有在其中记录任何值。设想一张时间表,其中包含9个静态行(项目名称),然后是每个员工正在处理的其他项目或作业。因此,在ssrs中,当我设计ssrs报告时,每个员工将自动拥有9个静态行,对应于项目名称,其余的将是他们从事的任何工作。即使静态行没有在其中输入任何时间(值),它们也应该仍然显示。

左联接建议查询的结果


这是我的ssrs报告结尾的示例

您需要使用
左连接
。如果您有两个表,
tab\u one
tab\u two
,并且希望在表之间的共享列上联接,但保留
tab\u one
中没有匹配项的
tab\u two
中的所有值,则使用
tab\u one LEFT join tab\u two

因此,在不使用特定列的情况下,您可以使用:

SELECT
    *
FROM
    projectname p
LEFT JOIN
    employeetimesheets e
ON
    p.pkid = e.abbrevjob - 2;  

供您查询。

我不确定您对其余部分做了什么,但我会使用交叉连接来获取每个项目的所有员工列表

SELECT DISTINCT Employee, project  
FROM projectname
CROSS JOIN employeetimesheets 
然后将您的查询的其余部分加入到此


我摆弄了你的电脑。

我想这就是你想要的,我相信在甲骨文上他们称之为“加密”。您的数据未规范化,并且存在与
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将为您填写矩阵。)如果没有,那么您还有一点工作要做,但这是一个类似的想法。您可能希望填充一个日历日期表以使其更简单

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


在获得这些数据之后,就可以使用外部联接来附加数据。在没有数据的情况下,会留下一个null,表示矩阵中的空单元格。

我认为您只需要左连接。您的
不存在
子查询显然是错误的,因为您没有筛选任何内容。对您的架构和您自己的查询进行调整可以帮助我们,也可以帮助您:)。还可以添加sqlserver标记。这是我刚刚创建的sql调整,所以我已经尝试过了。我已经发布了您建议的上述查询的结果。正如我们所看到的,每个empid仍然不接受缺少的projectname值。这个查询只是将表与记录合并在一起,而我的目标是填充每个员工缺少的项目名称。我不太明白您到底想要什么。您希望联接这两个表,但保留所有不存在与联接条件匹配的项目名称。那么,在这种情况下,您希望第二个表中的行发生什么情况?我希望每个员工都有projectname,即使他们没有在其中记录任何值。设想一张时间表,其中包含9个静态行(项目名称),然后是每个员工正在处理的其他项目或作业。因此,在ssrs中,当我设计ssrs报告时,每个员工将自动拥有9个静态行,对应于项目名称,其余的将是他们从事的任何工作。即使静态行没有放入任何时间(值),它们也应该仍然显示出来。这在查询中起到了一定的作用,但它起到了作用。非常感谢。我想知道你是怎么理解这个逻辑的?如果你有时间,请解释汉克斯很多,我也花了时间阅读加密,它帮助了很多。