sql:多个左连接后的情况

siv3szwd  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(254)

我正在使用mysql和一个名为 students . 我试图添加一个列,指出一个学生是来自美国、欧洲、南美洲,还是不是这些国家。具体来说,如果这些都不是真的,我想在列中加0,如果是美国,我想加1,如果是欧洲,我想加2,如果是南美,我想加3。
所以我在做这样的事情:

SELECT name,
CASE WHEN ... 
FROM original_table or
LEFT JOIN us_table us
ON or.student_id = us.student_id
LEFT JOIN europe_table eur
ON or.student_id = eur.student_id
LEFT JOIN south_america_table sa
ON or.student_id = sa.student_id

我的电脑有问题 CASE WHEN 部分。我可以说“当 id us表中的列不为null,其他 id 列(来自欧洲和南美)为空,记录为1。
同样,如果 id 欧洲表的列不为空,美国和南美表的列不为空 id 列为空,记录为2。
有更好的办法吗?

pcrecxhr

pcrecxhr1#

我认为你的数据结构很糟糕。一般来说,将等价信息(如地理信息)拆分到不同的表中并不是一个好的数据模型。
我只想用 exists :

SELECT name,
       (CASE WHEN EXISTS (SELECT 1 FROM us_table us WHERE ot.student_id = us.student_id)
             THEN 1
             WHEN EXISTS (SELECT 1 FROM europe_table eur WHERE ot.student_id = eur.student_id)
             THEN 2
             WHEN EXISTS (SELECT 1 FROM south_america_table sa WHERE ot.student_id = sa.student_id)
             THEN 3
             ELSE 0
        END) as origin
FROM original_table ot;

我还将表别名更改为 otor ,因为 or 是一个保留字。

g6ll5ycj

g6ll5ycj2#

测试每个 NULL 似乎是最好的办法。使用 ELSE 对于 0 价值观。

CASE WHEN us.student_id IS NOT NULL THEN 1
     WHEN eur.student_id IS NOT NULL THEN 2
     WHEN sa.student_id IS NOT NULL THEN 3
     ELSE 0
END

相关问题