【问题标题】:using Full join in sql server在 sql server 中使用完全连接
【发布时间】:2017-08-10 20:01:49
【问题描述】:

我有 2 个表数据要连接在一起,每个表都少 1 行日期 示例:表 A 有 8 行日期,表 b 也有 8 行日期,但两个表都有 1 行日期不同。我希望我的结果显示为 10 行

表A

RN  USERID  ClockIn CHECKTIME   badgenumber
1   6       8:24AM  2017-03-02  107
1   6       7:57AM  2017-03-03  107
1   6       8:23AM  2017-03-06  107
1   6       8:26AM  2017-03-07  107
1   6       8:57AM  2017-03-08  107
1   6       8:33AM  2017-03-09  107
1   6       8:36AM  2017-03-10  107
1   6      8:15AM   2017-03-13  107 

表 B

RN  USERID  ClockOut    CHECKTIME   badgenumber
1   6       9:31PM      2017-03-01  107
1   6       10:28PM     2017-03-02  107
1   6       8:22PM      2017-03-03  107
1   6       9:18PM      2017-03-06  107
1   6       9:48PM      2017-03-07  107
1   6       9:11PM      2017-03-08  107
1   6       11:31PM     2017-03-09  107
1   6       6:30PM      2017-03-10  107

我的结果显示为

SELECT #clockin.ClockIn, #clockOut.ClockOut,#clockin.USERID,#clockin.CHECKTIME
FROM #clockin
FULL JOIN #clockOut
ON #clockin.CHECKTIME=#clockOut.CHECKTIME
where #clockin.userid = 6 and #clockOut.userid = 6
ORDER BY #clockin.userid;

<!DOCTYPE html>
        <html>
        <body>
    
        <h2>result</h2>
        <img src="https://i.stack.imgur.com/IcdSS.png" alt="result" >
    
        </body>
        </html>

【问题讨论】:

    标签: sql-server inner-join outer-join


    【解决方案1】:

    由于您的 where 子句,您将过滤掉 x.useridnull 的行(没有匹配项)。这实际上将您的full join 变成了inner join。您可以使用 coalesce() 从两列中返回第一个非空值,并将其与 6 进行比较,如下所示:

    SELECT #clockin.ClockIn, #clockOut.ClockOut,#clockin.USERID,#clockin.CHECKTIME
    FROM #clockin
      FULL JOIN #clockOut
        ON #clockin.CHECKTIME=#clockOut.CHECKTIME
    where coalesce(#clockin.userid,#clockOut.userid)=6
    ORDER BY #clockin.userid;
    

    【讨论】:

    • @ShanweiLim 更新
    【解决方案2】:
    SELECT ClockIn, ClockOut,
           ISNULL(ci.USERID, co.USERID) AS USERID,
           CONVERT(VARCHAR(10), ISNULL(ci.CHECKTIME, co.CHECKTIME), 101) AS CHECKTIME
    FROM #ClockIn AS ci
    FULL JOIN #ClockOut AS co ON (co.CHECKTIME = ci.CHECKTIME);
    

    这应该会为示例数据提供所需的输出。但是,您可能需要考虑在 JOIN 过滤器中添加 RN、USERID 等,具体取决于您的需要。

    ISNULL() 将 ClockIn 的 NULL id 替换为 ClockOut 的 id。

    【讨论】:

    • 如果有的话,请告诉我其他行的示例徽章编号和用户 ID。
    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2012-03-28
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多