2017-03-28 41 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';