使用两个任务列表和用户列表连接表

时间:2016-06-02 17:21:17

标签: sql tsql left-join inner-join

我在为我们的业务构建的此查询中有一个关于加入用户表的问题。它是基于用户完成的7个不同任务的小生产率报告。

有两个任务表: 1)核对表任务 2)请求的任务

请求的任务是Checklist Task的扩展。 请求的任务具有REQUESTED DATE列,该列位于请求的任务表中 请求的任务具有COMPLETED DATE列,该列位于Checklist Task表中。

当我运行下面的查询时,显然是SecurityIdentity表,它仅由CompletedByID通过Checklist Task表连接以显示其全名。

任务名称'录制的文档'这是一个请求的核对表,具有请求日期(RequestedDate来自请求任务表)和接收日期(来自核对表表的CompletedDate),来自上面提到的两个不同的表。

for (int i = 0, max = questions.size(); i < max; i++) {
    Question question = questions.get(i);

    /* all of that previous code */

    if (question.getId() == null) {
        entityManager.persist(question);
    }
    else {
        /* merge() returns the newly merged and managed (as in it is now part of
           the persistence context) instance, so replace the "old" one */
        questions.set(i, entityManager.merge(question));
    }
}

当我查询这个sql时,结果是红色方块: Result

然而,斯泰西没有要求,但凯西做了。因此,结果日期/时间戳应该显示为Kathy请求Recorded Docs而不是Stacey。

我已经尝试了很多不同的方法来加入安全身份表来纠正这个问题,但是无法这样做..任何帮助都会非常感激!

以下是三个表格: 任务 enter image description here

requestedtask enter image description here

的SecurityIdentity

enter image description here

1 个答案:

答案 0 :(得分:2)

我认为您的问题可能与您在Task表中加入的ID有关。正如现在所写,无论是谁请求任务,您将显示完成任务的人的姓名,因为您已加入CompletedByID。如果请求与分配同义,那么您应该加入AssignedToID。在任何情况下,您都需要确定要显示的名称并加入相应的ID。

以下是我注意到的其他一些可以改变/改进的事情:

  1. OR op.NAME LIKE'WO115%'之后,你错过了一个右括号。除非您确切知道自己要做什么,否则不应允许OR和AND语句在同一组括号中组合使用。

  2. 您可以将所有那些op.Name替换为'XXXX%',并将其替换为()

  3. 使用下面的功能,如果您的姓名没有编入索引,或者您有大量记录,您可能会看到一些显着的减速。你现在拥有它的方式并没有错,但使用下面显示的in()可能会更容易。

    LEFT(op.Name,4) in('XXXXX%','YYYYY%',...,'ZZZZZ%')
    
    1. 最后,您在此处向我们提供了大量信息,这有助于您更轻松地完成工作。那就是说,你给了我们大量的信息。从我看来,我可以告诉你的企业与抵押贷款或财务有关,这意味着某人可能对你的数据结构感兴趣。此外,您已经向我们提供了表名,模式名称以及少数员工的姓名。我不是黑客,但我可以想象有人可能会发现这些信息很有用。将来,我会考虑更新一些关键业务信息,或者在屏幕截图中模糊更多数据。