我的sql查询不返回条件不正确的空值行

时间:2015-06-12 06:01:19

标签: sql-server

我的查询是:

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)

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

6 个答案:

答案 0 :(得分:3)

如果要包含空行,最好是明确的:

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使用three-valued logic,其中与NULL的比较通常会生成第三个逻辑值UNKNOWN,而不是TRUEFALSE

答案 1 :(得分:1)

尝试这个

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
        )

答案 2 :(得分:0)

还返回referece_id null rows

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))

答案 3 :(得分:0)

如果子查询返回某些结果, 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)

答案 4 :(得分:0)

实际上是的,您没有在NULL栏中考虑reference_id。为了考虑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))"

答案 5 :(得分:0)

我建议使用左连接而不是in in,因为在一个巨大的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

这应该完全符合你的要求。

祝你好运, 离子