2014-10-28 31 views
0

因此,我一直在替换我的应用程序中的所有旧查询,以删除*=运算符。在其中一个查询中,我在查找为什么输出不同时遇到了一些问题。更新后的SQL查询返回无数据,即使有交叉连接

这是旧的查询:

SELECT 
    URMS_User_Name AS FE_Name, 
    URMS_User_ID AS FE_Code, 
    COUNT(MRFS_FE_Code) AS No_Of_Jobs, 
    SCRM_Service_Center_Name AS Service_Center_Name, 
    CSMSDVLP.fnGetExpertise(URMS_User_ID) AS Expertise 
FROM 
    TBL_User_Master, 
    TBL_Service_Center_Master, 
    TBL_User_Role, 
    TBL_MR_FE_Schedule 
WHERE     
    USRL_Role_Code = 'FE' AND 
    URMS_User_ID = USRL_User_ID AND  
    SCRM_Service_Center_ID = URMS_Service_Center_ID AND 
    URMS_User_ID *= MRFS_FE_Code AND 
    MRFS_Scheduled_Date >= '28-Oct-2014 00:00:00' AND 
    MRFS_Scheduled_Date <= '04-Nov-2014 00:00:00' 
GROUP BY 
    SCRM_Service_Center_Name, 
    URMS_User_Name, 
    URMS_User_ID 
ORDER BY 
    URMS_User_ID 

这是更新查询:

SELECT 
    URMS_User_Name AS FE_Name, 
    URMS_User_ID AS FE_Code, 
    COUNT(MRFS_FE_Code) AS No_Of_Jobs, 
    SCRM_Service_Center_Name AS Service_Center_Name, 
    CSMSDVLP.fnGetExpertise(URMS_User_ID) AS Expertise 
FROM 
    TBL_User_Master 
    Left Join TBL_MR_FE_Schedule 
     ON URMS_User_ID = MRFS_FE_Code 
    Inner Join TBL_Service_Center_Master 
     ON SCRM_Service_Center_ID = URMS_Service_Center_ID 
    Inner Join TBL_User_Role 
     ON URMS_User_ID = USRL_User_ID 
WHERE 
    USRL_Role_Code = 'FE' 
    AND MRFS_Scheduled_Date >= '28-Oct-2014 00:00:00' 
    AND MRFS_Scheduled_Date <= '04-Nov-2014 00:00:00' 
GROUP BY 
    SCRM_Service_Center_Name, 
    URMS_User_Name, 
    URMS_User_ID 
ORDER BY 
    URMS_User_ID 

旧的查询返回的数据完全正常,但新的查询返回的空行。我尝试用交叉连接和同样的问题替换所有连接。

虽然奇怪的是如果我运行没有日期条件的查询,一切似乎工作正常。所以,现在,我很困惑我是否犯了一个错误,或者它只是一个疯狂的老运营商。

回答

1

外连接表上的条件属于ON子句。外连接的记录具有NULL的MRFS_Scheduled_Date,所以在您的WHERE子句中删除这些,从而将外连接变为内连接。由于WHERE子句比以前更严格,这可能是没有得到任何结果的原因。

SELECT 
    URMS_User_Name AS FE_Name, 
    URMS_User_ID AS FE_Code, 
    COUNT(MRFS_FE_Code) AS No_Of_Jobs, 
    SCRM_Service_Center_Name AS Service_Center_Name, 
    CSMSDVLP.fnGetExpertise(URMS_User_ID) AS Expertise 
FROM TBL_User_Master 
LEFT JOIN TBL_MR_FE_Schedule ON URMS_User_ID = MRFS_FE_Code AND MRFS_Scheduled_Date >= '28-Oct-2014 00:00:00' AND MRFS_Scheduled_Date <= '04-Nov-2014 00:00:00' 
INNER JOIN TBL_Service_Center_Master ON SCRM_Service_Center_ID = URMS_Service_Center_ID 
INNER JOIN TBL_User_Role ON URMS_User_ID = USRL_User_ID 
WHERE USRL_Role_Code = 'FE' 
GROUP BY SCRM_Service_Center_Name, URMS_User_Name, URMS_User_ID 
ORDER BY URMS_User_ID; 
+0

所以,我应该将日期条件移动到Join子句?好吧,让我尽快尝试,并回到你身边。 它的工作原理。我不知道,我的外部连接自动转换为内部连接。 – jitendragarg 2014-10-28 11:10:38