【问题标题】:Select Data based on Inner OR left join in Table B根据表 B 中的内部或左连接选择数据
【发布时间】:2019-06-15 07:52:47
【问题描述】:

我有表 A 和表 B 我想从表 A (EmpID) 中选择带有一些连接和子句的数据。 现在我必须申请加入表 B (EMPID,NPINumber,NPIEndDate) 所有文件都是可选的。

但条件是 NPIEndDate 是我们数据库中的可选字段 Like NPIEndDate is Null OR NPIEndDate > = CurrentDate 现在写入查询

1.如果 NPINumber 存在,则从 A & B 表中选择数据
2.Select Data from A & B Table If NPIEndDate is Null OR NPIEndDate > = CurrentDate

当前日期是:27/06/2018

一张桌子:

+-------+
| EmpId |
+-------+
|     1 |
|     2 |
|     3 |
|     4 |
+-------+

B表:

+-------+-----------+------------+
| EMPID | NPINumber | NPIEndDate |
+-------+-----------+------------+
|     1 |      1001 | NULL       |
|     2 |      1234 | 27/04/2018 |
|     3 |     12345 | 27/06/2018 |
+-------+-----------+------------+

输出

+-------+-----------+------------+
| EMPID | NPINumber | NPIEndDate |
+-------+-----------+------------+
|     1 |      1001 | NULL       |
|     3 |     12345 | 27/06/2018 |
|     4 |           |            | 
+-------+-----------+------------+

【问题讨论】:

  • 请提供样本数据和预期结果。
  • 您想要两个查询还是一个查询来获取您的数据?
  • 仅单一查询
  • 你的例子中StatelicenseEndDate在哪里?
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)对于包含 DBMS/产品和 DDL 的 SQL,其中包括约束、索引和基表初始化。在给出关系(船舶)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。

标签: sql sql-server tsql left-join inner-join


【解决方案1】:

你可以试试这个:

SELECT 
      a.EMPID,b.NPINumber,b.NPIEndDate 
FROM A 
    LEFT JOIN B 
          ON a.EMPID=b.EMPID
WHERE ISNULL(b.NPIEndDate,GETDATE())>='2018-06-27 00:00:00.000'

【讨论】:

    【解决方案2】:

    据我了解

    SELECT 
     DATA 
    FROM
      A
    INNER JOIN B
    ON (A.EmpID = B.EMPID AND (NPIEndDate <> '' or NPIEndDate is not null)
    

    更新 2: 根据您提供的数据

    SELECT 
     DATA 
    FROM
      A
    INNER JOIN B
    ON (A.EmpID = B.EMPID AND NPIEndDate >= CurrentDate AND (NPIEndDate = '' or NPIEndDate is null))
    

    【讨论】:

      【解决方案3】:

      这是一个简单的连接,在WHERE 子句中有一些条件

      SELECT *
      FROM A INNER JOIN B
      ON A.EMPID = B.EMPID
      WHERE B.NPIEndDate IS NULL
            OR
            B.NPIEndDate >= '2018-06-27';
      

      例如:

      SELECT *
      FROM (VALUES (1), (2), (3)) A(EMPID) 
      INNER JOIN 
      (VALUES (1, 1001,NULL), (2, 1234,'2018-04-27'), (3, 12345,'2018-06-27'))B(EMPID, NPINumber, NPIEndDate)
      ON A.EMPID = B.EMPID
      WHERE B.NPIEndDate IS NULL
            OR
            B.NPIEndDate >= '2018-06-27'; --You can use GetDate() here if that what you mean by current date
      

      【讨论】:

        【解决方案4】:

        如果我理解您的问题,您需要在 EmpId 与应用过滤器相同的表之间进行 join

        SELECT 
          A.EmpID, B.NPINumber, B.NPIEndDate 
        FROM 
          [Table A] A LEFT JOIN [Table B] B ON A.EmpID = B.EmpID 
        WHERE 
          B.EmpID IS NULL 
          OR (NOT B.NPINumber IS NULL AND
          (B.[NPIEndDate] IS NULL OR B.[NPIEndDate] >= '2018/06/27'));
        

        您可以使用此查询here

        【讨论】:

        • 它将从表 A 中排除那些记录,其中表 A 的 Emp Id 没有 NPIEndDate 为空
        • 我认为这就是您所需要的。请看@SANDEEP上面的答案。
        猜你喜欢
        • 1970-01-01
        • 2015-01-09
        • 1970-01-01
        • 2014-06-27
        • 1970-01-01
        • 2018-06-23
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多