具有条件的两个表上的内连接操作会产生不同的结果

时间:2014-09-24 10:43:07

标签: sql sql-server

我有两个具有以下结构的表:

表1:TASK_MASTER

TASK_ID |   TASK_CREATOR_ID  |   TASK_ASSIGNEE_ID  |   CREATED_DATE    
--------+--------------------+---------------------+------------------------
 1             1                      2                2014-09-24 12:00:00
 2             2                      1                2014-09-25 12:00:00

表2:USER_MASTER

USER_ID       NAME         PHONE_NUMBER
------------------------------------------
  1          ABHISEK       9804XXXXXX
  2          SMITH         9038XXXXXX

我需要TASK CREATOR (TASK_CREATOR_ID)的名称和TASK_ASSIGNEE(TASK_ASSIGNEE_ID)以及TASK_MASTER

USER_MASTER)名称

我试过这段代码:

select TM.TASK_ASSIGNEE,TM.TASK_CREATOR,
TM.CREATED_DATE,UM.FIRST_NAME,UM.FIRST_NAME,UM.PHONE_NUMBER
FROM TASK_MASTER TM
INNER JOIN USER_MASTER UM 
ON TM.TASK_ASSIGNEE_ID=UM.USER_ID  
AND TM.TASK_CREATOR_ID=UM.USER_ID 
where TASK_ID='1'

但它不起作用。

5 个答案:

答案 0 :(得分:1)

你需要两个连接:

select TM.TASK_ASSIGNEE, TM.TASK_CREATOR, TM.CREATED_DATE,
       UMA.FIRST_NAME,  UMA.FIRST_NAME, UMA.PHONE_NUMBER,
       UMC.FIRST_NAME,  UMC.FIRST_NAME, UMC.PHONE_NUMBER,
FROM TASK_MASTER TM LEFT JOIN
     USER_MASTER UMA
     ON TM.TASK_ASSIGNEE_ID = UMA.USER_ID LEFT JOIN
     USER_MASTER UMC
     ON TM.TASK_CREATOR_ID = UMC.USER_ID 
where TM.TASK_ID = '1';

我也将连接切换为Left Join s。如果其中一行没有匹配项,则任务仍会显示。

答案 1 :(得分:1)

您需要为创作者进行两次连接,为受让人进行一次连接。 id:s都不匹配。像这样:

select 
    TM.TASK_ASSIGNEE,
    TM.TASK_CREATOR,
    TM.CREATED_DATE,
    ASSIGNEE.FIRST_NAME,
    ASSIGNEE.FIRST_NAME,
    ASSIGNEE.PHONE_NUMBER,
    CREATOR.FIRST_NAME,
    CREATOR.FIRST_NAME,
    CREATOR.PHONE_NUMBER
FROM 
    TASK_MASTER AS TM 
    INNER JOIN USER_MASTER AS ASSIGNEE 
        ON TM.TASK_ASSIGNEE_ID=ASSIGNEE.USER_ID  
    INNER JOIN USER_MASTER AS CREATOR 
        ON TM.TASK_CREATOR_ID=CREATOR.USER_ID 
where 
    TASK_ID='1'

答案 2 :(得分:0)

在您的加入条件中,您规定受让人和创建者必须与用户ID相同。在您的示例表中,两个任务都没有相同的受让人或创建者。所以你什么也得不回来

答案 3 :(得分:0)

在加入2个表格中只放置1个cond。这样的事情: -

SELECT 
TM.TASK_ASSIGNEE,
TM.TASK_CREATOR,
TM.CREATED_DATE,
UM.FIRST_NAME,
UM.FIRST_NAME,
UM.PHONE_NUMBER
FROM 
TASK_MASTER TM 
INNER JOIN USER_MASTER UM 
    ON TM.TASK_ASSIGNEE_ID=UM.USER_ID  
WHERE 
TASK_ID='1';

这可能会对你有所帮助。

答案 4 :(得分:0)

您的查询会尝试查明是否有为自己创建任务的任务创建者,您需要再添加一个联接来完成此任务:

select 
    TM.TASK_CREATOR,
    UM1.FIRST_NAME as creator_first_name,
    UM1.PHONE_NUMBER as creator_phone_number,
    TM.TASK_ASSIGNEE,
    UM2.FIRST_NAME as assignee_first_name,
    UM2.PHONE_NUMBER as assignee_phone_number,
    TM.CREATED_DATE,
FROM 
    TASK_MASTER TM 
    INNER JOIN USER_MASTER UM1 
        ON TM.TASK_CREATOR_ID=UM1.USER_ID 
    INNER JOIN USER_MASTER UM2 
        ON TM.TASK_ASSIGNEE_ID=UM1.USER_ID 
where 
    TASK_ID='1'