我问了一个相关的问题,但后来意识到我问的用例是错误的。所以现在正确地问。
我有三张table:
TableA - Id, TableB_id
TableB - Id, Name, TableC_id
TableC - Id, Valid
有效值可以是0或1。
tablea->tableb和tableb->tablec之间存在一对多关系。
我想获取tablec.valid=0的tablea&tableb的所有记录。
另外,如果tablec的所有记录对于tableb都是valid=1,那么只获取tablea&tableb的数据。
换句话说,数据如下:
表A:
+----+-----------+
| ID | TableB_Id |
+----+-----------+
| 1 | 100 |
| 2 | 101 |
| 3 | 101 |
| 4 | 102 |
+----+-----------+
表B:
+-----+------+-----------+
| Id | Name | TableC_id |
+-----+------+-----------+
| 100 | Adam | 200 |
| 101 | Nick | 201 |
| 102 | Jim | 202 |
+-----+------+-----------+
表C:
+-----+-------+
| Id | Valid |
+-----+-------+
| 200 | 0 |
| 201 | 0 |
| 202 | 1 |
+-----+-------+
所以结果是:
+-----------+-----------+------+-----------+
| TableA_ID | TableB_ID | Name | TableC_ID |
+-----------+-----------+------+-----------+
| 1 | 100 | Adam | 200 |
| 2 | 101 | Nick | 201 |
| 3 | 101 | Nick | 201 |
| 4 | 102 | Jim | null |
+-----------+-----------+------+-----------+
我已经为第一部分编写了查询,但是如何包含第二个条件呢?
查询:
Select
a.id,
b.id,
b.name,
c.id
from
TableA a
inner join TableB b on a.TableB_id = b.id
inner join TableC c on b.TableC_id = c.id
where
c.valid = 1;
2条答案
按热度按时间gt0wga4j1#
在下面使用(使用oracle db)
8dtrkrch2#
与你的说法相反,你有
表C->表B和
表B->表A之间的一对多关系
我想
ID
是主键,列TableB_id
,TableC_id
是前面的外键。因此,编写查询的自然方式是join c-->b-->a
我使用outerjoin来显示b或a中的数据丢失的情况(如果不需要,可以随意退回到innerjoin)。
唯一不寻常的要求是需要隐藏表的id
C
如果行无效,可以使用CASE
陈述请注意,我重新排列了列以显示正确的层次结构,并删除了与讨论无关的列。