使用空值连接多个表

时间:2017-09-22 05:04:25

标签: sql

我有两张桌子

表1

StudentID   FullName    HoursLogged
1           Mark Smith       1
2           Jack Lantern     2
3           Pink Hotdog      3

表2

StudentID   FirstName   LastName
1              Mark      Smith
2              Jack     Lantern
3              Pink     Hotdog
4              Mike     Cantu
5              Jake     Myers
6              Nathan   Cheese
7              Peter    Jackson

我怎样才能像这样制作表格?如果用户没有记录小时数,则记录小时为0?

StudentID   FullName    HoursLogged
1           Mark Smith             1
2           Jack Lantern           2
3           Pink Hotdog            3
4           Mike Cantu             0
5           Jake Myyers            0
6           Nathan Cheese          0
7           Peter Jackson          0

非常感谢任何帮助。谢谢。

4 个答案:

答案 0 :(得分:2)

您可以执行outer join并将空值替换为0,这是您可以轻松实现此目的的方法,下面是外连接的示例

SELECT t2.StudentID ,t2.FirstName + ' '+ t2.LastName as FullName
       ISNULL(HoursLogged,0) as HoursLogged,  
FROM Table2 t2
LEFT OUTER Table1 t1 
ON t1.studentID = t2.studentID

答案 1 :(得分:1)

尝试此查询:

select b.StudentID ,concat( FirstName,' ', LastName), ISNULL(HoursLogged,0) 
as HoursLogged FROM Table1 a LEFT OUTER Table2 b ON a.StudentID = b.StudentID;

答案 2 :(得分:1)

您希望输出全部连接在一起,还是您要尝试合并表?

如果您只想将表格合并到一个输出中,我建议您查看JOIN子句。 Lasse Karlsen有一个很棒的联接发布可视化over here。具体来说,我认为你是在左连接之后,它将合并Table1和Table2,并给你一个输出。

此外,由于您在Table2中将全名拆分为两列,因此您必须输入一个CONCAT。 Concat会将多个字符串合并为一个字符串,然后您可以将其用于比较。例如。 CONCAT("字符串1","","字符串3")为您提供"字符串1字符串3" (没有引号)。

请记住,Table2中的Mark Smith似乎在他的LastName之前有一个额外的空格。要注意这一点,请添加TRIM。这将删除前导和尾随空格。

根据表格放在一起的人/方式/方式,名称仍然可能不完全匹配。如果你做一个简单的比较(Table1.col = Table2.col),那么名称必须匹配100%,包括案例(仅供参考,我想说这在Windows托管数据库中并不重要,但我和#39;我很确定它在Linux中很重要)。你可以抛出一个LOWER或UPPER功能来强制一切都是大写或小写。

这是我糟糕的伪代码:

SELECT Table1.StudentID, Table1.FullName, Table2.HoursLogged FROM Table1 LEFT JOIN Table2 ON CONCAT(UPPER(Table2.FirstName), " ", UPPER(Table2.LastName)) = UPPER(Table1.FullName)

我注意到有时数据库变得挑剔,所以你必须在那里扔一些坟墓。老实说,我不确定为什么有时这很重要,但我已经解决了过去出现的奇怪问题。

SELECT `Table1`.`StudentID`, `Table1`.`FullName`, `Table2`.`HoursLogged` FROM `Table1` LEFT JOIN `Table2` ON CONCAT(UPPER(`Table2`.`FirstName`), " ", UPPER(`Table2`.`LastName`)) = UPPER(`Table1`.`FullName`)

修改的 完全忘记了null部分。 Santho有正确的想法。

SELECT Table1.StudentID, Table1.FullName, ISNULL(Table2.HoursLogged, 0) AS `HoursLogged` FROM Table1 LEFT JOIN Table2 ON CONCAT(UPPER(Table2.FirstName), " ", UPPER(Table2.LastName)) = UPPER(Table1.FullName)

EDIT2 你知道,我再看一遍,现在感觉很傻......如果学生代表在两张桌子之间匹配,你就不必乱用所有的CONCAT东西了。

SELECT Table1.StudentID, Table1.FullName, ISNULL(Table2.HoursLogged, 0) AS `HoursLogged` FROM Table1 LEFT JOIN Table2 ON Table1.StudentID = Table2.StudentID

EDIT3 Jarlh是对的。 我认为连接字符串的标准是双竖条

"string 1" || "string 2"

https://msdn.microsoft.com/en-us/library/hh501243(v=sql.105).aspx

修剪前导/尾随空格

trim(both ' ' from 'string 1')

https://msdn.microsoft.com/en-us/library/hh544564(v=sql.105).aspx

LEFT JOIN不是标准的,但你可以为(自然)JOIN添加WHERE子句

SELECT Table1.StudentID, Table1.FullName, Table2.HoursLogged FROM Table1, Table2 WHERE Table1.StudentID = Table2.StudentID

ISNULL是一个不受所有数据库管理系统支持的功能,但COALESCE似乎无处不在。

SELECT Table1.StudentID, Table1.FullName, COALESCE(Table2.HoursLogged, 0) AS HoursLogged FROM Table1, Table2 WHERE Table1.StudentID = Table2.StudentID

答案 3 :(得分:0)

这取决于您使用的数据库的类型。选中https://www.w3schools.com/sql/sql_isnull.asp,然后使用正确的函数

和CONCAT连接2个字符串。

它看起来像这样,

SELECT Ifnull(table1.studentid, table2.studentid) 
       StudentID, 
       Ifnull(table1.fullname, Concat(table2.firstname, ' ', table2.lastname)) 
       FullName, 
       Ifnull(table1.hourslogged, 0) 
       HoursLogged 
FROM   table1 
       LEFT JOIN table2 
              ON table1.studentid = table2.studentid 

另外,你的表设计看起来很糟糕,不一致。 FirstName& 1表中的LastName,另一个表有FullName。

最好只设计它(或类似的东西)

  • 学生表(StudentID,FirstName,LastName)
  • HourLogged表(StudentID,HourlyLogged)