我试图在两个不同的列上连接三个表,但要注意的是,当某些列不匹配时,我希望有空白。这些表包含有关数学和英语测试的数据,因此我将两个基于共同测试列的测试表与一个学生表(通过ID列)结合在一起,这两个表均具有共同点。
从下面的图片中可以看到,在某些情况下,同一测试同时包含数学和英语,因此这两个表中均会出现,但是在其他情况下,将编写单独的测试。
这三个表是:
如您所见,MEG10测试在英语和数学之间共享,因为它们是一起编写的,并且在同一测试中。这是我要绊倒的地方,因为当测试以英语和数学形式出现时,我希望联接显示所有结果。但是,当测试分开进行时,我希望它在English或Math列中带有“ stuff”的空格(因为在那些应该空白的列中实际上没有信息)。本质上,当我加入他们时,我希望结果表如下所示。
我用来加入它们的代码是:
SELECT
m.ID, m.Test, m.M_Col1, m.M_Col2, m.M_Col3,
e.E_Col1, e.E_Col2, e.E_Col3,
s.First, s.Last
FROM M_Table AS m
INNER JOIN E_Table AS e ON (m.Test = r.Test)
JOIN S_Table AS s ON (m.ID = s.ID AND e.ID = s.ID)
WHERE m.Test LIKE '%2013%';
这给了我
现在,我了解到我正在加入“测试”列,这意味着我应该只获得它们都共享的测试,但是我不确定如何加入它,以便获得所需的结果。而且,我知道我只是从数学表中获取测试列,但我不希望有两个测试列。
我确定有办法做到这一点,但我不确定如何做到。如果我需要澄清我的问题,请告诉我。
答案 0 :(得分:1)
您需要所有ID和测试的列表-您可以像这样
SELECT m.ID, m.Test FROM Math_Table as M
UNION
SELECT e.ID, e.Test FROM English_Table as E
运行并理解输出
然后您将其加入到名称中,然后将其加入这样的测试中
SELECT m.ID, m.Test, m.M_Col1, m.M_Col2, m.M_Col3, e.E_Col1, e.E_Col2, e.E_Col3, s.First, s.Last
FROM (
SELECT m.ID, m.Test FROM Math_Table as M
UNION
SELECT e.ID, e.Test FROM English_Table as E
) as base
JOIN S_Table as S ON Base.ID = S.ID
LEFT JOIN M_Table AS m ON m.ID = base.ID AND m.Test = base.Test
LEFT JOIN E_Table AS e ON e.ID = base.ID AND e.Test = base.Test
WHERE base.Test LIKE '%2013%'
答案 1 :(得分:1)
您可以使用FULL OUTER JOIN
从数学表和英语表之间的关系的两端获取记录。基本上,FULL OUTER JOIN
返回两个表中的所有记录,并在联接条件匹配时将它们合并,否则将丢失的关系的列填充到NULL
中。
SELECT
COALESCE(m.ID, e.ID) id, COALESCE(m.Test, e.Test) Test,
m.M_Col1, m.M_Col2, m.M_Col3,
e.E_Col1, e.E_Col2, e.E_Col3,
s.First, s.Last
FROM M_Table AS m
FULL OUTER JOIN E_Table AS e ON m.Test = e.Test AND e.ID = e.ID
INNER JOIN S_Table AS s ON COALESCE(m.ID, e.ID) = s.ID
WHERE COALESCE(m.Test, e.Test) LIKE '%2013%';
提示:将表合并在一起数学和英语可能会简化数据库设计。将信息拆分为两个具有相同结构的表有什么好处?当更多的主题投入使用时,它将如何扩展?您可以只使用一个唯一的表,并在表中附加一列来存储主题名称(数学,英语,...)。