[英]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.