SQL 1
SELECT (
COUNT(contract.contract_notesid) + (SELECT COUNT(contract_notesid)
FROM quotation WHERE quotation.contract_notesid = contract.contract_notesid)
) AS total
FROM contract where contract_notesid = '48'
total 2
SQL 2
SELECT (
COUNT(contract.contract_notesid) + (SELECT COUNT(contract_notesid)
FROM quotation WHERE quotation.contract_notesid = 48)
) AS total
FROM contract where contract_notesid = '48'
total 6
contract table
:2条记录quotation table
:4条记录
1.为什么不一样?
2. SQL 2
,还有更好的方法吗?(total: 6
)
答案 0 :(得分:3)
这些查询不等效。您正在执行JOIN(笛卡尔积,然后修剪结果集)但在第二个中您有重复的结果,因为您在不同的条件下匹配,导致您的总数更高。对这两者的“正确”查询取决于你要做的事情。
可能的解决方案 -
你可以'尝试做以下事情:
select count(contract.contract_notesid) + count(quotation.contract_notesid)
from contract
join quotation
on contract.contract_notesid = quotation.contract_notesid
where contract.contract_notesid = '48'
但在您提供更多信息之前,这是一个疯狂的猜测。
答案 1 :(得分:0)
我不是MySQL专家(我知道一些Oracle),所以我不会猜测并回答你的第一个问题。
对于你的第二个问题: 你到底想要完成什么?
如果您希望records in the quotation table + number of records in the contract table
的数量为contract_notesid = 48
,那么您需要的只是
select
(
(select count(contract.contract_notesid) FROM contract where contract_notesid = '48')
+
(SELECT COUNT(contract_notesid) FROM quotation WHERE quotation.contract_notesid = 48)
) as TOTAL
from dual
如果您想要与contract_notesid = 48
相关联的合约的所有报价的计数,那么您需要加入:
SELECT COUNT(*) as total
FROM quotation quotation,
contract contract
WHERE quotation.contract_notesid = contract.contract_notesid
AND quotation.contract_notesid = '48'
答案 2 :(得分:0)
我注意到quotation.contract_notesid = 48
上的选择,但合同上的选择是where contract_notesid = '48'
- 引用后者,而前者不是。{这意味着引用和契约字段具有不同的类型,并且查询正在进行一些隐式转换。
我建议在第一个查询的WHERE
子句中明确地将数字字段转换为字符串。