2012-09-08 23 views
0

這個問題的Changing this query to group rows and filter out all rows apart from the one with smallest value但在最後一個額外位的延續....使用語句或子查詢嵌套組來過濾這個結果集

我有以下結果集:

275  72.87368055555555555555555555555555555556 foo 70 
275  72.87390046296296296296296296296296296296 foo 90 
113  77.06431712962962962962962962962962962963 foo 80 
113  77.07185185185185185185185185185185185185 foo 60 

,我從這個查詢了:

SELECT id, (tbl2.date_modified - tbl1.date_submitted)/86400, some_value 
FROM tbl1, tbl2, tbl3 
WHERE tbl1.id = tbl2.fid 
AND tbl1.id = tbl3.fid 

公告有4行2個IDS。我想過濾行以獲得第二列中的最小數字。這個固定:

SELECT id, min((tbl2.date_modified - tbl1.date_submitted)/86400), max(some_value) 
FROM tbl1, tbl2, tbl3 
WHERE tbl1.id = tbl2.fid 
AND tbl1.id = tbl3.fid 
GROUP BY tbl1.id 

,所以我就:

275  72.87368055555555555555555555555555555556 foo 70 
113  77.06431712962962962962962962962962962963 foo 80 

我怎樣才能改變它做相同的,但不包括在其他行與行some_value=90?即

113  77.06431712962962962962962962962962962963 foo 80 

我想我需要一些嵌套組或嵌套查詢?!

非常感謝:)。

+0

不,不是那麼簡單..可以說'5'行爲'1''',其中一行有'some_value'爲'90' ..然後我想排除所有的'5'行。 – ale

+1

你的所有列都來自哪裏,特別是'id'和'some_value'? – Ben

+0

'id'來自'tbl1','some_value'來自'tbl2'。謝謝 :) – ale

回答

1

您應該能夠使用NOT EXISTS

SELECT id, 
    min((tbl2.date_modified - tbl1.date_submitted)/86400), 
    max(some_value) 
FROM tbl1, tbl2, tbl3 
WHERE tbl1.id = tbl2.fid 
    AND tbl1.id = tbl3.fid 
    AND NOT EXISTS (SELECT id 
        FROM tbl2 
        WHERE tbl1.id = tbl2.fid 
        AND some_value = 90) 
GROUP BY tbl1.id 

或者使用ANSI聯接語法:

SELECT id, 
    min((tbl2.date_modified - tbl1.date_submitted)/86400), 
    max(some_value) 
FROM tbl1 
INNER JOIN tbl2 
    ON tbl1.id = tbl2.fid 
INNER JOIN tbl3 
    ON tbl1.id = tbl3.fid 
WHERE NOT EXISTS (SELECT id 
        FROM tbl2 
        WHERE tbl1.id = tbl2.fid 
        AND some_value = 90) 
GROUP BY tbl1.id 
1

您可以使用where not exists

select a.id, min((b.date_modified - a.date_submitted)/86400), max(some_value) 
    from tbl1 a 
    join tbl2 b 
    on a.id = b.fid 
    join tbl3 c 
    on a.id = c.fid 
where not exists (select 1 
         from tbl2 
        where fid = a.id 
         and some_value >= 90) 
group by a.id 

not in

select a.id, min((b.date_modified - a.date_submitted)/86400), max(some_value) 
    from tbl1 a 
    join tbl2 b 
    on a.id = b.fid 
    join tbl3 c 
    on a.id = c.fid 
where a.id not in (select fid 
         from tbl2 
         and some_value >= 90) 
group by a.id 
1

首先,您應該使用標準JOIN語法編寫查詢。如果你只是想和SOME_VALUE = 90排除行,在WHERE子句中做到這一點:

SELECT id, min((tbl2.date_modified - tbl1.date_submitted)/86400), max(some_value) 
FROM tbl1 join 
    tbl2 
    on tbl1.id = tbl2.fid join 
    tbl3 
    on tbl1.id = tbl3.fid 
WHERE somevalue = 90 
GROUP BY tbl1.id 

我不知道你所說的「不包括在其他行與SOME_VALUE = 90行」的意思。如果要排除所有結果行,如果有一個90什麼,然後用HAVING子句:

SELECT id, min((tbl2.date_modified - tbl1.date_submitted)/86400), max(some_value) 
FROM tbl1 join 
    tbl2 
    on tbl1.id = tbl2.fid join 
    tbl3 
    on tbl1.id = tbl3.fid 
GROUP BY tbl1.id 
HAVING sum(case when somevalue = 90 then 1 else 0 end) > 0 

另一個祕訣:始終包含您的列的別名,所以每個人都知道他們是來自哪個表。