在FULL JOIN中使用COALESCE,返回重复值

时间:2018-12-16 18:28:02

标签: sql sql-server

我正在尝试将不同的键链接在一起。 下列问题必须在ServiceObjectId和TaskId上联合projid密钥。最简单的方法似乎是使用or语句。

所以:

FULL JOIN PROJTABLE
    ON PROJTABLE.PROJID = MSM_TASKTABLE.PROJID
    or PROJTABLE.PROJID = MSM_SERVICEOBJECTTABLE.SERVICEOBJECTID

但是表现却很糟糕 那就是我尝试使用COALESCE函数的方式。 如以下脚本所示

INSERT INTO AR_BI_sleutels (DataareaId,PartyId,ContractId,RentalObjectId,ObjectId,ServiceObjectId,ServiceCallId,TaskId,ProjId)
Select
    ,PMCCONTRACT.CONTRACTID
    ,PMCCONTRACTOBJECT.RENTALOBJECTID
    ,PMEOBJECT.OBJECTID
    ,MSM_SERVICEOBJECTTABLE.SERVICEOBJECTID
    ,MSM_SVCCALLTABLE.SVCCALLID
    ,MSM_TASKTABLE.TASKID
    ,COALESCE(TASK.PROJID,SERVICE.PROJID) AS PROJID
From PMCCONTRACT
FULL JOIN PMCCONTRACTOBJECT
    ON PMCCONTRACTOBJECT.RENTALOBJECTID = PMCCONTRACT.RENTALOBJECTID
        AND PMCCONTRACTOBJECT.DATAAREAID = PMCCONTRACT.DATAAREAID
FULL JOIN MSM_SERVICEOBJECTTABLE
    ON MSM_SERVICEOBJECTTABLE.EXTOBJECTID = PMEOBJECT.OBJECTID
FULL JOIN MSM_SVCCALLTABLE
    ON MSM_SVCCALLTABLE.SERVICEOBJECTID = MSM_SERVICEOBJECTTABLE.SERVICEOBJECTID
FULL JOIN MSM_TASKTABLE
    ON MSM_TASKTABLE.SVCCALLID = MSM_SVCCALLTABLE.SVCCALLID
FULL JOIN PROJTABLE as Task
    ON Task.PROJID = MSM_TASKTABLE.PROJID
FULL JOIN PROJTABLE as Service
    ON service.PROJID = MSM_SERVICEOBJECTTABLE.SERVICEOBJECTID
WHERE (PMCCONTRACT.CONTRACTSTATUS is null OR PMCCONTRACT.CONTRACTSTATUS <> 5)
        AND COALESCE(TASK.PROJID,SERVICE.PROJID) IS NOT NULL

但是,此语句返回重复的值。 关于如何使工作正常的任何想法?

1 个答案:

答案 0 :(得分:1)

ReportViewer1.LocalReport.EnableExternalImages = true; string imagePath = new Uri(Server.MapPath("~/images/Mudassar.jpg")).AbsoluteUri; ReportParameter parameter = new ReportParameter("ImagePath", imagePath); ReportViewer1.LocalReport.SetParameters(parameter); ReportViewer1.LocalReport.Refresh(); FULL JOIN类型,表示即使不满足查找条件,也保留两个集合中的行。最初,通过OUTER JOIN PROJTABLE 一次,您已经将FULL JOIN 一次的所有行馈入了最终结果。您通过PROJTABLE两次FULL JOIN 来更改了逻辑,因此您将PROJTABLE 两次的所有行都馈入了最终结果。现在,我猜想使用PROJTABLE时,您认为它类似于原始查找(或查看我的PS)中的OR条件,但是它不会执行现在需要做的事情:您不想保留COALESCE的所有行两次。您需要在最终查询中或仅从PROJTABLE收集行的子查询中使用distinct,或者您可能会考虑是否确实需要PROJTABLE的所有行并可能更改PROJTABLE类型。

PS JOIN声明如果没有TASK或SERVICE匹配都从最终结果中删除(因为NULL只能由COALESCE(TASK.PROJID,SERVICE.PROJID) IS NOT NULL返回所有的参数都为空)-这不是您的原始声明。