2016-11-28 43 views
0

我想将此查询转换为不存在。将NOT IN转换为NOT EXISTS SQL firebird

SELECT * FROM MYCARD T1 
WHERE T1.IDMONEY = 5 AND T1.IDCARD = 80 
AND EXISTS (
    SELECT IDCARD, YEAR, MONEY 
    FROM MYCARD T2 
    WHERE T2.IDCARD = T1.IDCARD 
    AND T2.YEAR = T1.YEAR 
    AND T2.MONEY = T1.MONEY 
    GROUP BY T2.IDCARD, T2.YEAR, T2.MONEY 
    HAVING COUNT(T2.IDCARD) > 1 
) 
AND T1.ID not in ( -- THIS NOT IN TO NOT EXISTS 
    select min(ID) 
    from MYCARD 
    WHERE IDMONEY = 5 
    AND IDCARD = 80 
    group by IDCARD, YEAR 
) 

我想获得ID不同于min(ID)的值。这不是很好,但我需要更优化的查询。我试图用这样的事情,但是这似乎是正确的,但它不是最优化:

AND EXISTS (
    select min(ID) 
    from MYCARD 
    WHERE IDMONEY = 5 
    AND IDCARD = 80 
    group by IDCARD, YEAR 
    HAVING T1.ID = MIN(ID) 
) 

回答

-2
select * from MYCARD T1 WHERE NOT EXISTS (
select 1 from MYCARD WHERE IDMONEY = 5 
AND IDCARD = 80 
group by IDCARD, YEAR) 
+0

它返回不在其中的行。我可以添加一些像HAVING T1.ID = min(ID)?? – ktos1234

+0

这不会产生正确的结果,因为它不相关。 –

0

如果使用not exists两次就OK了,你可以做到以下几点:

select * 
from MYCARD T1 
where not exists 
(
select 1 
from MYCARD T2 
where ID = T1.ID and IDMONEY = 5 AND IDCARD = 80 and not exists 
(
    select 1 
    from MYCARD 
    where IDMONEY = 5 AND IDCARD = 80 and ID < T2.ID) 
) 
0

不完全NOT EXISTS,但EXISTS


 -- The original query selects the values that 
     -- don't have the *minimum* value per {idcard,idmony}. 
     -- NOT the minimum := a lower value exists 
     -- -------------------------------------------------- 
SELECT * 
FROM mycard t1 
WHERE EXISTS (SELECT * 
    FROM mycard x 
    WHERE x.idmoney = t1.idmoney 
    AND x.idcard = t1.idcard 
    AND x.id < t1.id -- a lower value exists 
    ) 
AND t1.idmoney = 5 
AND t1.idcard = 80 
     ; 
+0

我编辑了我的问题,我需要不同的结果。 – ktos1234

+0

[请不要改变这个问题。人们已经回答了这个问题的旧版本]你可以为COUNT(*)子查询做类似的事情。如果count()> 1,则必须有'x.id> t1.id AND the_same_matching_fields'的记录。 – joop

+0

我不得不添加一些细节,问题是一样的。我不知道你的意思,你可以编辑你的答案吗? – ktos1234