我的查询是:
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
,而不是TRUE
或FALSE
。
尝试这样做
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
这应该完全可以满足您的需求。
此致敬意离子的