我的查询是:
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
行的行。
我的查询有什么问题吗?
答案 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
,而不是TRUE
或FALSE
。
答案 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
这应该完全符合你的要求。
祝你好运, 离子