我有两张桌子
表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
非常感谢任何帮助。谢谢。
答案 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。
最好只设计它(或类似的东西)