【问题标题】:Get only LHS data for specific where condition仅获取特定位置条件的 LHS 数据
【发布时间】:2020-06-11 01:05:28
【问题描述】:

我问了一个related 的问题,但后来意识到我问的用例是错误的。所以现在问正确。

我有 3 张桌子:

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 的有效 = 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;

【问题讨论】:

  • "...如果 TableC 的所有记录都有效 = 1 对于 TableB" 我希望我能理解!

标签: sql oracle


【解决方案1】:

在下面使用(使用 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;

【讨论】:

    【解决方案2】:

    与你的说法相反,你有一个

    TableC -> TableB

    之间的一对多关系

    TableB -> TableA 之间的一对多关系

    我假设ID 是一个主键,而TableB_idTableC_id 列是外键

    所以编写查询的自然方式是连接 C --> B --> A

    我正在使用 outer join 来显示 B 或 A 中的数据丢失的情况(如果不需要,请随时退回到内部连接)。

    唯一不寻常的要求是如果行无效,您需要隐藏表的 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多