我有两个表,称之为Table1和Table2。 Table1的主键为“ID”,Table2的外键字段为“Table1ID”。
我可以运行此连接,但只有在两个表中都有匹配的主键和外键值时,它才会按照我希望的方式工作。
SELECT a.*, sum(b.Time) AS Time FROM Table1 AS a JOIN Table2 AS b ON a.ID = b.Table1ID
正如您所看到的,我正在尝试从Table1中提取所有字段以及Table2中字段“Time”的总和,其中主键和外键匹配。
如果没有外键,我仍然希望显示Table1中的记录,“Time”字段应该只显示0。
答案 0 :(得分:0)
首先,听起来你需要使用聚合,因为你试图对给定id的时间求和。使用group by
并根据需要定义字段(vs *)。
其次,您需要使用outer join
来返回那些没有匹配项的记录。
最后,您可以使用coalesce
将null
总和转换为0:
SELECT a.id,
coalesce(sum(b.Time),0) AS Time
FROM Table1 AS a
LEFT JOIN Table2 AS b ON a.ID = b.Table1ID
GROUP BY a.id
答案 1 :(得分:0)
您写入的查询将不会执行,因为如果存在不在group by子句中的其他字段,则不允许在select子句中执行聚合函数。所以有两个选择:
将Table1中的每个字段包含在您的select和group by子句中,例如:
SELECT a.ID, a.Attribute1, a.Attribute2, a.Attribute3...
, coalesce(sum(b.Time), 0) AS Time
FROM Table1 AS a
LEFT JOIN Table2 AS b
ON a.ID = b.Table1ID
Group by a.ID, a.Attribute1, a.Attribute2, a.Attribute3
或者您可以创建一个子查询,在Table2上进行聚合,然后与Table1连接。
SELECT a.*
, coalesce(b.Time, 0) AS Time
FROM Table1 AS a
LEFT JOIN
(
SELECT Table1ID, SUM(Time) Time
FROM Table2
GROUP BY Table1ID
) AS b
ON a.ID = b.Table1ID
请注意,您需要LEFT JOIN,这意味着无论第二个表中是否存在匹配记录,都会返回第一个表(Table1)中的每个记录。如果您没有想要在结果中使用null,如果没有匹配,那么您可以添加coalesce函数将任何空值转换为零。