2016-05-30 93 views
0

我希望我可以解释自己很好,所以我有2个表与一对多连接(TableA和TableB)。现在,TableB具有一个具有外键表格A的列和一个指向第三TableC的ID(外键)。现在,一般2〜3排从TableA的共享相同的FK,这是我可能的情况:如果存在,选择非空值,否则为空,但始终选择行

  1. 具有相同FK_TableA所有行具有相同的FK_TableC
  2. 具有相同FK_TableA所有行已为NULL FK_TableC
  3. 与同FK_TableA所有行具有NULL或相同FK_TableC像这样:

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

因此两行不能有相同的FK_TableA和DIFF erent FK_TableC可以是相同的,也可以是另一个是空或全为空。

现在我的问题是如何根据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 
------------------------- 

在此先感谢您。

+0

因此,等待,对于上面的表,你期望得到所有这三行?或只是第一个或?.. – sagi

+0

只是非空值如果存在,但我认为我发布这个问题太快,我想我找到了答案使用MAX和GROUP BY –

+0

仍然不明白,但欢呼​​声。我认为你现在可以删除这个问题。 – sagi

回答

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