如果存在,则选择非null值null,但始终选择行

时间:2016-05-30 10:25:58

标签: sql sql-server

我希望我能解释自己很好,所以我有2个表与一对多连接(TableA和TableB)。现在,TableB有一个外键形式为TableA的列,以及一个到第三个TableC的ID(外键)。现在通常2到3行共享来自TableA的相同FK,这是我可能的情况:

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

    TableB
    ----------------------------
    |ID| FK_TableA | FK_TableC |
    ----------------------------
    |1 |    123    |    321    |
    |2 |    123    |    321    |
    |3 |    123    |    NULL   |
    ----------------------------
    
  5. 因此,2行不能具有相同的FK_TableA和不同的FK_TableC它们是相同的或者在它上面而另一行是null或全部为空。

    现在我的问题是如何基于FK_TableA明确地选择FK_TableC,以便如果任何具有FK_TableA的行具有值(非空),则选择该值为null并将结果连接到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
    -------------------------
    

    提前谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了答案,感谢这个问题的回答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