SQL:多个左联接后的情况

时间:2018-08-30 16:27:02

标签: mysql sql

我正在将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部分遇到了麻烦。我可以这样说:“当US表中的id列不为空,而其他id列(来自欧洲和南美)为空时,则记录为1。

类似地,如果Europe表中的id列不为空,而US和South America表中的id列为空,则记录2。

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

针对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 

答案 1 :(得分:0)

我认为您的数据结构非常糟糕。通常,将等效信息(例如地理信息)划分到不同的表中并不是一个好的数据模型。

我只会使用B(*)(A)

auto main() -> int

我还将表别名从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; ,因为ot是保留字。