4

という名前の次のテーブルがあるとしますmeals

| | 食事 | 星 |
-----------------
| | ステーキ | 1 |
| | ステーキ | 2 |
| | 魚 | 4 |
| | 魚 | 4 |
| | サラダ | 5 |

同じ食事で星が異なるレコードを取得するにはどうすればよいですか? 星だけが違うレコードが欲しい。

上記の表の結果は次のようになります。

| | 食事 | 星 |
-----------------
| | ステーキ | 1 |
| | ステーキ | 2 |

次のクエリを試しました。

SELECT DISTINCT t1.*
FROM meals t1
INNER JOIN meals t2 ON t1.meal = t2.meal
AND t1.stars <> t2.stars;

しかし、あまりにも多くの時間を消費し、かなりの量のメモリを消費します。

私のテーブルの実際のサイズは次のとおりです。

SELECT pg_size_pretty(pg_relation_size('table_name'));
 pg_size_pretty
----------------
 2295メガバイト

だから私は何か他のことを考え出す必要があり、私はあなたの助けを求めています!

4

4 に答える 4

7
SELECT  a.*
FROM    meals a
        INNER JOIN
        (
            SELECT  meal
            FROM    meals
            GROUP   BY meal
            HAVING  COUNT(DISTINCT stars) > 1
        ) b ON a.meal = b.meal

出力

╔═══════╦═══════╗
║ MEAL  ║ STARS ║
╠═══════╬═══════╣
║ steak ║     1 ║
║ steak ║     2 ║
╚═══════╩═══════╝
于 2013-04-03T08:51:57.437 に答える
1
 SELECT meal,stars FROM meals
 GROUP BY meal,stars
 HAVING count(*)=1 and meal in (
    SELECT meal FROM meals
    GROUP BY meal
    HAVING count(*)>1 )
于 2013-04-03T08:52:56.360 に答える
0

同じ結果を達成するためのシンプルで迅速な方法

SELECT  
  m.*
FROM    
  meals m
  JOIN meals m2 ON ( m2.meal = m.meal AND m2.stars<>m.stars)
于 2013-04-03T17:10:31.477 に答える
0

これが最速の方法です。

SELECT  *
FROM    meals m
WHERE   EXISTS (SELECT FROM meals WHERE meal = m.meal AND stars <> m.stars);

「少なくとも 1 つの他の食事が存在し、同じ名前で星が異なるすべての行を取得します。」

NULL値が発生しないと仮定します。

SQL フィドル。

于 2013-04-03T11:28:28.247 に答える