【发布时间】:2016-05-30 10:25:57
【问题描述】:
我希望我能很好地解释自己,所以我有 2 个具有一对多连接的表(TableA 和 TableB)。现在,TableB 有一个列,其中包含 TableA 的外键,以及第三个 TableC 的 ID(外键)。现在通常 2 到 3 行共享来自 TableA 的相同 FK,这是我可能的场景:
- 具有相同 FK_TableA 的所有行具有相同的 FK_TableC
- 具有相同 FK_TableA 的所有行的 FK_TableC 都为 NULL
-
具有相同 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,我会得到所有行,带有NULL和NON NULL值,看看我对TmpTable 做了什么,如果我要使用LEFT JOIN我将获得所有三行(ID:1、2 和 3),我的结果将如下所示:[| 123 | 321 |] [| 123 | 321 |] [| 123 | NULL |] 如果我添加 DISTINCT 它只会消除 123 | 之一321 行,但我会保留 null,我希望它没有 NULL 行。
标签: sql sql-server