繁体   English   中英

SQL 读取多个表并自连接

[英]SQL read multiple tables and self join

一直在努力学习 SQL 并陷入了一个我想了解的问题:

给定下表:

TABLE - Customer.movie_id
ID  MOVIE_ID
-------------
x   Spiderman     
y   Batman   
z   Avengers  

TABLE - Customer.game_id
ID  GAME_ID
-------------
A   COD     
C   HALO   
D   BATTLEFEILD
B   MINECRAFT  

TABLE - Customer.type_id
ID  TYPE_ID
-------------
ii   AGE     
jj   GENDER   
kk   INCOME  

TABLE - Customer.Info
ID  MOVIE_ID  GAME_ID   TYPE_ID   DATA
--------------------------------------------
1     x          A        ii       20
2     x          A        jj       F
3     x          C        kk       1000
4     y          C        ii       40
5     y          D        jj       M
6     y          C        kk       5000
7     z          B        ii       60
8     z          B        jj       F
9     z          C        kk       10000

生成一个 output,仅当 MOVIE_ID 和 GAME_ID 与 GENDER 类型行上的相同值匹配时,它才会显示 AGE 行。

TABLE - Customer.Info

ID  MOVIE_ID  GAME_ID   TYPE_ID   DATA
--------------------------------------------
1     x          A        ii       20
7     z          B        ii       60

我已经能够在 python 中单独进行查询并在那里进行处理,但我不知道如何将所有这些组合成一个查询。

谁能帮忙?

此数据 model 未正确规范化,所有内容的命名都很糟糕,但除此之外,您可能需要某种形式的 EXISTS 子句,例如:

select
    i.*
from
    customer.info i
    join
    customer.type_id ti on ti.id = i.type_id
where
    ti.type_id = 'AGE'
    and
    exists(
        select 1
        from customer.info i2
        join customer.type_id ti2 on ti2.id = i2.type_id
        where i2.movie_id = i.movie_id
        and i2.game_id = i.game_id
        and ti2.type_id = 'GENDER'
    )
/

或者,如果 EXISTS 不可用,您可以加入两个子查询:

select 
    age_info.*
from
    (
        select i.*
        from customer.info i
        join customer.type_id ti on ti.id = i.type_id
        where ti.type_id = 'AGE'
    ) age_info
    join
    (
        select distinct i.movie_id, i.game_id
        from customer.info i
        join customer.type_id ti on ti.id = i.type_id
        where ti.type_id = 'GENDER'
    ) gender_info
    on gender_info.movie_id = age_info.movie_id
    and gender_info.game_id = age_info.game_id
/

这可能是最短的。 如果存在具有相同 ID 和性别的任何其他行,则返回它:

select i1.*
from Customer.Info i1 inner join Customer.Info i2
    on      i2.MOVIE_ID = i1.MOVIE_ID and i2.GAME_ID = i3.GAME_ID
        and i1.TYPE_ID = 'ii' and i2.TYPE_ID = 'jj'
where and exists (
    select 1 from Customer.Info i3
    where i3.ID <> i2.ID
        and i3.MOVIE_ID = i2.MOVIE_ID and i3.GAME_ID = i2.GAME_ID
        and i3.TYPE_ID = 'jj' and i3.DATA = i2.DATA
);

我不知道您是否打算将两个以上的组全部匹配在一起而没有变化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM