我正在尝试将不同的键链接在一起。 下列问题必须在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
但是,此语句返回重复的值。 关于如何使工作正常的任何想法?
答案 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
返回所有的参数都为空)-这不是您的原始声明。