【问题标题】:Select Data not have a key in other table选择数据在其他表中没有键
【发布时间】:2021-03-22 19:33:00
【问题描述】:

我有两张桌子 1- 日期表

------------
|    Date   |
------------
| 1/11/2020 |
-----------
| 2/11/2020 |
------------

2- 收入

    ------------------------------------
    |  revDate  |  Name     |  Revenue  |
    ------------------------------------
    | 1/11/2020 |  Joe      |   500 $   |
    ------------------------------------
    | 2/11/2020 |   Dani    |   400 $   |
    ------------------------------------
    | 4/11/2020 |   Sami    |   300 $   |
    ------------------------------------

我需要一个查询来返回用户名,而不是在日期表中提交收入 查询应该返回:

    ------------------------------------
    |  Date     |  UserNotSubmit        |
    ------------------------------------
    | 1/11/2020 |  Dani                 |
    ------------------------------------
    | 1/11/2020 |  Sami                 |
    ------------------------------------
    | 2/11/2020 |  Joe                  |
    ------------------------------------
    | 2/11/2020 |  Sami                 |
    ------------------------------------

【问题讨论】:

    标签: sql sql-server subquery inner-join not-exists


    【解决方案1】:

    你可以递归地申请CROSS JOIN然后LEFT JOIN比如

    SELECT rr.revDate AS Date, rr.Name AS UserNotSubmit
      FROM
      ( SELECT r1.revDate, r2.Name, r1.Name AS Name2
          FROM Revenues r1
         CROSS JOIN Revenues r2) rr
      LEFT JOIN Revenues r3
             ON r3.revDate != rr.revDate
            AND r3.Name = rr.Name 
     WHERE r3.revDate IS NOT NULL
     ORDER BY rr.revDate
    

    更新:确实上面的查询带来了所有不匹配的记录而不需要Date表,但是如果你想过滤掉由于Date列的匹配值Date 表,然后应用一个简单的 (INNER) JOIN 如

    WITH Rev AS
    (
    SELECT rr.revDate AS Date, rr.Name AS UserNotSubmit
      FROM
      ( SELECT r1.revDate, r2.Name, r1.Name AS Name2
          FROM Revenues r1
         CROSS JOIN Revenues r2) rr
      LEFT JOIN Revenues r3
             ON r3.revDate != rr.revDate
            AND r3.Name = rr.Name 
      WHERE r3.revDate IS NOT NULL
    )
    SELECT r.*
      FROM Rev r
      JOIN Date d
        ON d.Date = r.Date
      ORDER BY r.Date
    

    Demo

    【讨论】:

      【解决方案2】:

      您可以使用cross join 生成日期和名称的所有组合,然后筛选出那些存在的组合:

      select d.date, n.name
      from dates
      cross join (select distinct name from revenues) n
      where not exists (select 1 from revenues r where r.revdate = d.date and r.name = n.name)
      

      【讨论】:

        【解决方案3】:

        您可以按如下方式使用反连接:

        SELECT D.DATE, R.NAME FROM DATES D
        JOIN REVENUE R ON D.DATE <> R.REVDATE
        

        【讨论】:

        • 这将,例如,带来日期4/11/2020。
        • 怎么样?我用过 D.DATE
        猜你喜欢
        • 2021-12-02
        • 2023-03-10
        • 2018-03-18
        • 1970-01-01
        • 2017-11-12
        • 2019-12-13
        • 2012-06-13
        • 1970-01-01
        • 2010-09-08
        相关资源
        最近更新 更多