0

この質問は、このクエリを変更して行をグループ化し、値が最小で最後に余分なビットがある行を除くすべての行を除外するための続きです。

次の結果セットがあります。

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

2つのIDを持つ4つの行があることに注意してください。行をフィルタリングして、2番目の列の最小数のみを取得したかったのです。これはそれを修正しました:

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

ネストされたグループまたはネストされたクエリが必要だと思いますか?!

どうもありがとう :)。

4

3 に答える 3

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
于 2012-09-08T15:56:35.737 に答える
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
于 2012-09-08T15:56:37.497 に答える
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

もう1つのヒント:列のエイリアスを常に含めて、どのテーブルからのものかを誰もが知っているようにします。

于 2012-09-08T15:57:24.730 に答える