热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

返回不符合连接的行-Gettingrowsreturnedthatdon'tconformtoaJOIN

Ihavetwotypesofrowsinatable:表中有两种类型的行:Thereisthestandarddata,whichistiedtoata

I have two types of rows in a table:

表中有两种类型的行:

enter image description here

There is the standard data, which is tied to a taskId and is loaded into the database during a process, the first two rows below are this type of data. The second type of data is not loaded in the process, it is inserted as part of a form. YOu can see the difference because the first type of data has a taskId and NonScrumStoryId is NULL. In the second case, NonScrumStoryId column is populated and TaskId is NULL.

有一个标准数据,它绑定到一个taskId并在处理过程中加载到数据库中,下面的前两行是这种类型的数据。第二种类型的数据不会被加载到流程中,而是作为表单的一部分插入。您可以看到差异,因为第一类数据有一个taskId,而非scrumstoryid为空。在第二种情况下,非scrumstoryid列是填充的,而TaskId是NULL。

I have a query to get data from this table:

我有一个查询来从表中获取数据:

DECLARE @startDateParam DATETIME
    ,@endDateParam DATETIME
    ,@productId VARCHAR(100)
    ,@search VARCHAR(100)
    ,@userParam VARCHAR(100)
    ,@orgTeamPK VARCHAR(100)

SET @startDateParam = '2013-11-25 00:00:00'
SET @endDateParam = '2013-12-01 23:59:59'
SET @productId = '%'
SET @search = '%%'
SET @userParam = '%'
SET @orgTeamPK = '%'

SELECT '3' AS RowType
        ,DTH.EnteredBy AS Person
        ,COALESCE(PDT.[Name], APP.AppName) AS Project
        ,(
            CASE WHEN (
                        STY.KanBanProductId IS NOT NULL
                        AND STY.SprintId IS NULL
                        ) THEN 'KanBan' WHEN (
                        STY.KanBanProductId IS NULL
                        AND STY.SprintId IS NOT NULL
                        ) THEN 'Sprint' ELSE SCY.Catagory END
            ) AS ProjectType
        ,COALESCE(STY.[Number], NSS.IncidentNumber) AS StoryNumber
        ,COALESCE(STY.Title, NSS.[Description]) AS StoryTitle
        ,CONVERT(VARCHAR(20), STY.Effort) AS Effort
        ,COALESCE(TSK.[Name], '') AS Task
        ,CONVERT(VARCHAR(20), TSK.OriginalEstimateHours) AS OriginalEstimateHours
        ,SCY.Catagory AS Category
        ,NSS.IncidentNumber AS IncidentNumber
        ,APP.AppName AS ApplicationName
        ,CAST(SUM(CASE WHEN DATEPART(dw, DTH.ActivityDate) = 2 THEN DTH.[Hours] ELSE 0 END) AS VARCHAR(20)) AS MondayHours
        ,CAST(SUM(CASE WHEN DATEPART(dw, DTH.ActivityDate) = 3 THEN DTH.[Hours] ELSE 0 END) AS VARCHAR(20)) AS TuesdayHours
        ,CAST(SUM(CASE WHEN DATEPART(dw, DTH.ActivityDate) = 4 THEN DTH.[Hours] ELSE 0 END) AS VARCHAR(20)) AS WednesdayHours
        ,CAST(SUM(CASE WHEN DATEPART(dw, DTH.ActivityDate) = 5 THEN DTH.[Hours] ELSE 0 END) AS VARCHAR(20)) AS ThursdayHours
        ,CAST(SUM(CASE WHEN DATEPART(dw, DTH.ActivityDate) = 6 THEN DTH.[Hours] ELSE 0 END) AS VARCHAR(20)) AS FridayHours
        ,CAST(SUM(CASE WHEN DATEPART(dw, DTH.ActivityDate) = 7 THEN DTH.[Hours] ELSE 0 END) AS VARCHAR(20)) AS SaturdayHours
        ,CAST(SUM(CASE WHEN DATEPART(dw, DTH.ActivityDate) = 1 THEN DTH.[Hours] ELSE 0 END) AS VARCHAR(20)) AS SundayHours
        ,CAST(SUM(DTH.[Hours]) AS VARCHAR(20)) AS TotalHours
        ,CAST(SUM(CASE WHEN DTH.Hours > 0 THEN DTH.[UserDifference] END) AS VARCHAR(20)) AS DifferentUsers
        ,CAST(SUM(CASE WHEN DTH.Hours > 0 THEN DTH.DoubleBookedFlag END) AS VARCHAR(20)) AS DoubleBookedFlag
        ,DTH.PointPerson AS PointPerson
    FROM DailyTaskHours DTH
    LEFT JOIN Task TSK ON DTH.TaskId = TSK.PK_Task
    LEFT JOIN Story STY ON TSK.StoryId = STY.PK_Story
    LEFT JOIN NonScrumStory NSS ON DTH.NOnScrumStoryId= NSS.PK_NonScrumStory
    LEFT JOIN SupportCatagory SCY ON NSS.CatagoryId = SCY.PK_SupportCatagory
    LEFT JOIN [Application] APP ON NSS.ApplicatiOnId= APP.PK_Application
    LEFT JOIN Sprint SPT ON STY.SprintId = SPT.PK_Sprint
    LEFT JOIN Product PDT ON STY.ProductId = PDT.PK_Product
    LEFT JOIN [User] USR ON DTH.EnteredBy = USR.DisplayName
    WHERE DTH.EnteredBy LIKE @userParam
        AND ActivityDate >= @startDateParam
        AND ActivityDate <= @endDateParam
        AND PDT.PK_Product LIKE @productId
        AND (
            (
                @orgTeamPK = '%'
                AND (
                    USR.[OrganizationalTeamId] LIKE @orgTeamPK
                    OR USR.[OrganizationalTeamId] IS NULL
                    )
                )
            OR (
                @orgTeamPK <> '%'
                AND (USR.[OrganizationalTeamId] LIKE @orgTeamPK)
                )
            AND (
                (
                    STY.Number LIKE @search
                    OR STY.Number IS NULL
                    )
                OR (
                    STY.Title LIKE @search
                    OR STY.Number IS NULL
                    )
                OR (
                    TSK.NAME LIKE @search
                    OR STY.Number IS NULL
                    )
                )
            )
    GROUP BY DTH.EnteredBy
        ,PDT.[Name]
        ,SPT.[Name]
        ,SPT.[Description]
        ,STY.[Number]
        ,STY.Title
        ,TSK.[Name]
        ,SCY.Catagory
        ,NSS.IncidentNumber
        ,APP.AppName
        ,STY.KanBanProductId
        ,STY.SprintId
        ,NSS.[Description]
        ,TSK.OriginalEstimateHours
        ,STY.Effort
        ,DTH.PointPerson
    HAVING SUM(DTH.[Hours]) > 0

My problem is that this query is only returning rows from the table that are from the process, it is not returning NonScrumStory columns and I need it to.

我的问题是,这个查询只返回来自流程的表中的行,它不返回非scrumstory列,我需要它。

Edit: It appears part of the WHERE clause is causing the issue.

编辑:它会出现WHERE子句的一部分,导致问题。

Ater investigation it probably has to do with this line:

之后的调查可能与这条线有关:

AND PDT.PK_Product LIKE @productId

How can I remedy this?

我该如何补救?

1 个解决方案

#1


4  

You're joining Task using

你加入任务使用

LEFT JOIN Task TSK ON DTH.TaskId = TSK.PK_Task

then joining Story using

然后加入故事使用

LEFT JOIN Story STY ON TSK.StoryId = STY.PK_Story

then joining Product using

然后加入产品使用

LEFT JOIN Product PDT ON STY.ProductId = PDT.PK_Product

(Note the Task -> Story -> Product reliance)

(注意任务->故事->产品依赖)

Those joins are all fine, but you're filtering on Product using

这些连接都很好,但是您正在对产品使用进行过滤

AND PDT.PK_Product LIKE @productId

This will, no matter what, match rows that have a product like the parameter which in turn limits the results to rows that have stories, which limits to rows that have tasks.

无论如何,这将匹配具有类似参数的行,该参数将结果限制为具有事例的行,将结果限制为具有任务的行。

You can check if @productId is null or equal to the product. This will allow you to return all rows if the parameter is not specified, or return rows filtered to the product.

您可以检查@productId是否为null或等于产品。如果没有指定参数,您可以返回所有的行,或者返回过滤到产品的行。

...
AND ActivityDate <= @endDateParam
AND (@productId IS NULL OR PDT.PK_Product LIKE @productId)
AND (
...

If you need to always filter on product, then you'll probably have to use a UNION and select all rows with tasks in one, then all rows with NonScrumStory in the other.

如果您需要始终对产品进行过滤,那么您可能必须使用一个UNION,并在其中一个中选择所有的行,然后在其他行中使用非scrumstory。


推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文讨论了在使用sp_msforeachdb执行动态SQL命令时,当发生错误时如何捕获数据库名称。提供了两种解决方案,并介绍了如何正确使用'?'来显示数据库名称。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
author-avatar
xiaoliangtang
将每一件小事做好、做成功、做极致,你就成长了!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有