[英]Where clause affecting two different select statements
我需要分別計算郵政編碼為44444的付款人和凡人。他們的郵政編碼存儲在同一張表中,但其ID以多對多關系存儲在兩個單獨的表中。 我寫了這個:
select count(mortal_zip) as "Mortals in 44444"
,count(payer_zip) as "Payers in 44444"
from
(select am.zip_code as mortal_zip
from address am
join mortal_address
on mortal_address.address_id = am.address_id
join mortal
on mortal.mortal_id = mortal_address.mortal_id
where trim(am.zip_code) = '44444'
) m,
(select ap.zip_code as payer_zip
from address ap
join payer_address
on payer_address.address_id = ap.address_id
join payer
on payer.payer_id = payer_address.payer_id
where trim(ap.zip_code) = '44444'
) p;
我知道這一點:沒有郵政編碼為44444的付款人,但是有3個人為44444的郵政編碼。由於某種原因,我得到的是0個人具有44444的郵政編碼。在44444中,我得到了所需的東西。 如果我用444444詢問凡人數目和付款人數目,則兩邊都為0。
另外,我嘗試用sub select重寫整個過程。
select count(m.mortal_zip) as "Mortals in 44444"
,count(p.payer_zip) as "Payers in 44444"
from
(select am.zip_code as mortal_zip
from address am
where trim(am.zip_code) = '44444'
and am.address_id in
(select mortal_address.address_id
from mortal_address
where mortal_address.mortal_id in
(select mortal.mortal_id
from mortal
)
)
) m,
(select ap.zip_code as payer_zip
from address ap
where trim(ap.zip_code) = '44444'
and ap.address_id in
(select payer_address.address_id
from payer_address
where payer_address.payer_id in
(select payer.payer_id
from payer
)
)
) p;
我得到相同的結果。
為什么其他select語句中的where函數會影響另一個select語句?
更新資料
我已經寫了查詢,但是這兩個查詢返回不同的值。
這個:
select m.mortal_zip as "Mortals in 44444"
,p.payer_zip as "Payers in 44444"
from
(select count(am.zip_code) as mortal_zip
from address am
where trim(am.zip_code) = '44444'
and am.address_id in
(select mortal_address.address_id
from mortal_address
where mortal_address.mortal_id in
(select mortal.mortal_id
from mortal
)
)
) m,
(select count(ap.zip_code) as payer_zip
from address ap
where trim(ap.zip_code) = '44444'
and ap.address_id in
(select payer_address.address_id
from payer_address
where payer_address.payer_id in
(select payer.payer_id
from payer
)
)
) p;
返回值:
Mortals in 44444 Payers in 44444
---------------- ---------------
3 0
這個:
select mortal_zip as "Mortals in 44444"
,payer_zip as "Payers in 44444"
from
(select count(am.zip_code) as mortal_zip
from address am
join mortal_address
on mortal_address.address_id = am.address_id
join mortal
on mortal.mortal_id = mortal_address.mortal_id
where trim(am.zip_code) = '44444'
) m,
(select count(ap.zip_code) as payer_zip
from address ap
join payer_address
on payer_address.address_id = ap.address_id
join payer
on payer.payer_id = payer_address.payer_id
where trim(ap.zip_code) = '44444'
) p;
返回值:
Mortals in 44444 Payers in 44444
---------------- ---------------
5 0
您的查詢正在嘗試JOIN
一個空結果集,該結果集具有三行。 當然,這將返回空結果集。 相反,您可以運行本身獲得COUNT
的子選擇,或者:
SELECT
COUNT(MA.address_id) AS "Mortals in 44444",
COUNT(PA.address_id) AS "Payers in 44444"
FROM
Address A
LEFT OUTER JOIN Mortal_Address MA ON MA.address_id = A.address_id
LEFT OUTER JOIN Payer_Address PA ON PA.address_id = A.address_id
WHERE
A.zip_code = '44444'
我建議使用UNION來獲取所需的值,然后對這些值求和:
SELECT SUM(MORTAL_ZIP) AS MORTAL_ZIP,
SUM(PAYER_ZIP) AS PAYER_ZIP
FROM (select COUNT(*) as mortal_zip,
0 as payer_zip
from address a
inner join mortal_address ma
on ma.address_id = a.address_id
inner join mortal m
on m.mortal_id = ma.mortal_id
where trim(a.zip_code) = '44444'
UNION ALL
select 0 as mortal_zip,
count(*) as payer_zip
FROM address a
inner join payer_address pa
on pa.address_id = a.address_id
inner join payer p
on p.payer_id = pa.payer_id
where trim(a.zip_code) = '44444')
祝你好運。
我可能不需要為此請求Stack Overflow,但這是我尋求的答案。 希望它可以幫助其他任何人繼續研究此線程。
select m.mortal_zip as "Mortals in 44444"
,p.payer_zip as "Payers in 44444"
from
(select count(am.zip_code) as mortal_zip
from address am
where trim(am.zip_code) = '44444'
and am.address_id in
(select mortal_address.address_id
from mortal_address
where mortal_address.mortal_id in
(select mortal.mortal_id
from mortal
)
)
) m,
(select count(ap.zip_code) as payer_zip
from address ap
where trim(ap.zip_code) = '44444'
and ap.address_id in
(select payer_address.address_id
from payer_address
where payer_address.payer_id in
(select payer.payer_id
from payer
)
)
) p;
我只需要在子選擇中放入count
。 就像@TomH所說的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.