SQL SELECT子句列添加行?

时间:2016-01-02 18:27:31

标签: mysql sql

我无法相信我所见证的。在完成这个简单的查询之后,我必须重新考虑我在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永远不应该被考虑。

2 个答案:

答案 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