sql 服务器 - 我的 sql 查询不返回 not 条件的空值行



我的查询是:

SELECT (SUM(credit)-SUM(debit)) AS balance
FROM member_transaction
WHERE member_id=" + mId + " AND reference_id NOT IN (
    SELECT user_reference_id FROM r_request WHERE status=7)

但它不会返回reference_id列中NULL的行。我的查询有什么问题吗?

如果要

包含空行,最好明确:

SELECT (SUM(credit)-SUM(debit))AS balance
FROM member_transaction
WHERE member_id=" + mId + " AND
      (
         reference_id NOT IN(
            SELECT user_reference_id FROM r_request WHERE status=7)
         OR reference_id IS NULL
      )

SQL使用三值逻辑,其中与NULL的比较通常产生第三个逻辑值UNKNOWN,而不是TRUEFALSE

尝试这样做

SELECT (SUM(credit) - SUM(debit)) AS balance
FROM member_transaction
WHERE member_id = " + mId + "
    AND isnull(reference_id, 0) NOT IN (
        SELECT user_reference_id
        FROM r_request
        WHERE STATUS = 7
        )

也返回referece_id空行

SELECT (SUM(credit)-SUM(debit))AS balance FROM member_transaction 
WHERE 
    member_id=" + mId + " 
    AND ( (referece_id is null) or 
          (reference_id NOT IN
              (SELECT user_reference_id FROM r_request WHERE status=7))

其实是的,你没有考虑第 NULL 列中的 reference_id s.为了考虑NULL,您应该显式定义OR条件。

进行以下查询。它将sargable,并将在第 reference_id 列上使用潜在的索引:

"SELECT (SUM(credit)-SUM(debit)) AS balance
 FROM member_transaction
 WHERE member_id=" + mId + " AND (reference_id IS NULL OR reference_id NOT IN (
    SELECT user_reference_id FROM r_request WHERE status=7))"

如果子查询返回某些结果,则会自动从主查询中删除NULL值。但是,如果子查询没有要返回的记录,则只会返回NULL值。

所以你可以使用

SELECT (SUM(credit)-SUM(debit))AS balance 
FROM member_transaction 
WHERE member_id=" + mId + " 
AND (reference_id NOT IN
(SELECT user_reference_id FROM r_request WHERE status=7) OR reference_id  IS NULL)

我建议使用左连接而不是非加入,因为它在一个巨大的r_request表上可能会很慢。

SELECT (SUM(credit) - SUM(debit)) AS balance
    FROM member_transaction mt
    LEFT JOIN r_request r
            ON mt_dat.reference_id = r.user_reference_id
    WHERE member_id = " + mId + "
        AND r.user_reference_id is null

这应该完全可以满足您的需求。

此致敬意离子的

最新更新