我无法相信我所见证的。在完成这个简单的查询之后,我必须重新考虑我在SQL中的所有知识和10年经验:
SELECT CASE
WHEN SUM(COALESCE(lids_sids.counter, 0)) - SUM(COALESCE(lids_sids.leaved, 0)) > 0
THEN '1'
ELSE '2'
END as connected
FROM books
JOIN `lines` as l ON books.lid = l.id
LEFT JOIN lids_sids ON l.id = lids_sids.lid
即使books.lid不包含lines.id,我也会获得 1行。结果是'2'
如果我这样做:
SELECT books.id
FROM books
JOIN `lines` as l ON books.lid = l.id
LEFT JOIN lids_sids ON l.id = lids_sids.lid
我得到 0行,正如我在第一次查询中所期望的那样。
我确信只能通过设置JOIN,WHERE,GROUP BY子句来添加和删除行。现在我了解到更改SELECT子句的内容可以改变行号。疯了!我正在使用mysql。
Table books.lid contains the values: 6, 207, 220, 285, 307, 326
while lines.id: 68, 69, 70, 71, 72, 73, 74
lids_sids.lid: 68
books.lid永远不会匹配lines.id和表lids_sids永远不应该被考虑。
答案 0 :(得分:3)
不同之处在于聚合函数SUM。它将始终返回单个值/行。
如果你会这样做:
SELECT SUM(books.id)
FROM books
JOIN `lines` as l ON books.lid = l.id
LEFT JOIN lids_sids ON l.id = lids_sids.lid
即使表中没有任何连接记录,您也会获得单个值。
答案 1 :(得分:0)
有几件事正在发生。首先,没有System.Diagnostics.Debug.WriteLine(p.X);
的聚合查询只返回一行。总是。由于GROUP BY
中的SUM()
,您的查询是一个汇总查询。
您的查询(简化了一下并使用表别名):
SELECT
该行将包含1或2.它将包含哪个?好吧,SELECT (CASE WHEN SUM(COALESCE(ls.counter, 0)) > SUM(COALESCE(ls.leaved, 0))
THEN '1'
ELSE '2'
END) as connected
FROM books b JOIN
lines l
ON b.lid = l.id LEFT JOIN
lids_sids ls
ON l.id = ls.lid;
并没有那么做。 COALESCE()
忽略SUM()
个值(无论如何都将它们视为0)。但是,如果没有匹配的行,您仍然会获得NULL
值。因此,没有行," 2"因为条件不正确而被退回。
如果您想要NULL
,请移动COALESCE()1
SUM()`:
*outside* the