仅获取特定where条件的lhs数据

von4xj4u  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(240)

我问了一个相关的问题,但后来意识到我问的用例是错误的。所以现在正确地问。
我有三张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;
gt0wga4j

gt0wga4j1#

在下面使用(使用oracle db)

Select
    a.id,
    b.id,
    b.name,
    decode(c.valid,0,c.id,null)  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;
8dtrkrch

8dtrkrch2#

与你的说法相反,你有
表C->表B和
表B->表A之间的一对多关系
我想 ID 是主键,列 TableB_id , TableC_id 是前面的外键。
因此,编写查询的自然方式是join c-->b-->a
我使用outerjoin来显示b或a中的数据丢失的情况(如果不需要,可以随意退回到innerjoin)。
唯一不寻常的要求是需要隐藏表的id C 如果行无效,可以使用 CASE 陈述

select 
 case when c.valid = 0 then c.id end tableC_id,
 b.id tableB_id,
 a.id tableA_id
from c
left outer join b on c.id = b.TableC_id
left outer join a on b.id = a.tableb_id;

 TABLEC_ID  TABLEB_ID  TABLEA_ID
---------- ---------- ----------
       200        100          1
       201        101          2
       201        101          3
                  102          4

请注意,我重新排列了列以显示正确的层次结构,并删除了与讨论无关的列。

相关问题