簡體   English   中英

Where子句影響兩個不同的select語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM