2017-03-28 72 views
0

我有以下查詢存在1:選擇記錄中,其中僅在連接表

SELECT 
    A.POSTCARD_ID, A.STAMP_ID, B.END_DT 
FROM 
    PST_VS_STAMP A 
JOIN 
    STAMP B ON A.POSTCARD_ID = B.POSTCARD_ID 
WHERE 
    B.ACCOUNT LIKE 'AA%' 
    AND B.END_DT = '9999-12-31' 
GROUP BY 
    A.POSTCARD_ID, A.STAMP_ID, B.END_DT 
HAVING 
    COUNT(A.POSTCARD_ID) < 2 

但我得到錯誤的結果。

我只想要明信片ID的PST_VS_STAMP表中有1條記錄(HAVING < 2)。我如何查詢這個?

+0

添加一些示例表數據和預期的結果 - 都管不好格式化文本。 – jarlh

+1

標記數據庫。如果你的'END_DT'列的數據類型爲'date',那麼比較之前最好先將它轉換。 – Utsav

+0

爲什麼即使是「GROUP BY」?在你的查詢中有**沒有聚合**功能.....使絕對沒有意義.... –

回答

0

在子查詢中進行聚合,僅在希望一行的表上進行聚合。因爲有一個行,你可以使用一個聚合函數拉出所有列的值(min(col)一行是列的值):

select s.postcard_id, vs.stamp_id, s.end_dt 
from stamp s join 
    (select vs.postcard_id, min(stamp_id) as stamp_id 
     from pst_vs_stamp vs 
     group by vs.postcard_id 
     having count(*) = 1 
    ) s 
    on vs.POSTCARD_ID = s.POSTCARD_ID 
where s.ACCOUNT like 'AA%' and s.END_DT = '9999-12-31';