【问题标题】:Select the non-null value if exists else null, but always select the row如果存在则选择非空值否则为空,但始终选择行
【发布时间】:2016-05-30 10:25:57
【问题描述】:

我希望我能很好地解释自己,所以我有 2 个具有一对多连接的表(TableA 和 TableB)。现在,TableB 有一个列,其中包含 TableA 的外键,以及第三个 TableC 的 ID(外键)。现在通常 2 到 3 行共享来自 TableA 的相同 FK,这是我可能的场景:

  1. 具有相同 FK_TableA 的所有行具有相同的 FK_TableC
  2. 具有相同 FK_TableA 的所有行的 FK_TableC 都为 NULL
  3. 具有相同 FK_TableA 的所有行都具有 NULL 或相同的 FK_TableC,如下所示:

    TableB
    ----------------------------
    |ID| FK_TableA | FK_TableC |
    ----------------------------
    |1 |    123    |    321    |
    |2 |    123    |    321    |
    |3 |    123    |    NULL   |
    ----------------------------
    

所以 2 行不能有相同的 FK_TableA 和不同的 FK_TableC,要么相同,要么有,另一个为 null 或全部为 null。

现在我的问题是如何根据 FK_TableA 区别地选择 FK_TableC,以某种方式,如果 FK_TableA 的任何行具有值(非空),则选择该值,否则为空并将结果连接到 TableA?

我一直在尝试使用 JOINS 和 FROM - WHERE,但我总是丢失或双行。所以从上表中我需要像这样选择:

TmpTable
-------------------------
| FK_TableA | FK_TableC |
-------------------------
|    123    |    321    | => From Above
|    124    |    NULL   | => If all FK_TableC ware null
|    125    |    325    | => If at least one or all FK_TableC ware 325
-------------------------

提前谢谢你。

【问题讨论】:

  • 那么等等,对于上面的表格,您希望得到所有这三行吗?或者只是第一个或?..
  • 只有非空值(如果存在),但我认为我这次发布的问题太快了,我想我使用 MAX 和 GROUP BY 找到了答案
  • 还是没听懂,不过加油。我想你现在可以删除问题了。
  • 我很困惑 - 你不只是在寻找 LEFT JOIN 吗?
  • @LesH 如果我使用LEFT JOIN,我会得到所有行,带有NULLNON NULL 值,看看我对TmpTable 做了什么,如果我要使用LEFT JOIN 我将获得所有三行(ID:1、2 和 3),我的结果将如下所示:[| 123 | 321 |] [| 123 | 321 |] [| 123 | NULL |] 如果我添加 DISTINCT 它只会消除 123 | 之一321 行,但我会保留 null,我希望它没有 NULL 行。

标签: sql sql-server


【解决方案1】:

感谢Easiest way to eliminate NULLs in SELECT DISTINCT?这个问题的答案,我找到了答案,也许我不应该急着问。我的查询看起来像这样:

SELECT A.ID, A.NAME, C.ID_D FROM TABLE TableA A
LEFT JOIN (SELECT DISTINCT FK_TableA, MAX(FK_TableC) AS ID_C FROM TableB
GROUP BY (FK_TableA)) B ON B.FK_TableA = A.ID
LEFT JOIN TableC C ON C.ID = B.ID_C

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多