1

emp_details という名前のデータベースに複数の行がある SQLServer にデータベースがあります。テーブルにはいくつかのフィールドが含まれており、そのうちの 1 つは給与です。給与は従業員ごとに一意ではないため、一意の給与値ごとに 1 つの完全な行をフェッチする必要があります。

参考になりそうな質問を教えてください。

データベースのサンプル:

a   b       c   d       e   f

17  IL11    53  IL11    48  58
26  IL10    53  IL10    48  58
31  IL15    53  IL15    48  58
32  IL16    53  IL16    24  58
33  IL17    53  IL17    36  58
34  IL18    53  IL18    36  58
37  IL21    53  IL21    36  58
40  IL24    53  IL24    48  58

これを列eでフィルタリングしたい(給与フィールドであると仮定)

4

4 に答える 4

1
SELECT
    *
FROM
    emp_details
WHERE
    Salary IN(
              SELECT
                  Salary
              FROM
                  emp_details
              GROUP BY  
                   Salary
              HAVING
                    COUNT(*) = 1
              )
于 2012-07-04T12:15:46.593 に答える
1

スキーマがないため、パフォーマンスが向上するかどうかは不明です。しかし、これはうまくいくはずです。

WITH Emp_Salary
AS
(
    SELECT 
        Column1
        , Column2
        , Salary
        , ROW_NUMBER() OVER (PARTITION BY Salary ORDER BY Column1) r  --numbers each row uniquely per salary
        FROM emp_details
)
SELECT
    Column1
    , Column2
    , Salary
FROM Emp_Salary
WHERE r = 1 -- Filters all but the first row per salary.
;
于 2012-07-04T12:11:27.567 に答える
0

select distinct salary from emp_details給与値の範囲を示します。

他の行を取得するには...必要な行をどのように選択しますか?

あなたができるIDのPKを持っているなら

select * from emp_details where id in ( select Max(id),Salary from emp_details group by salary )

于 2012-07-04T11:50:10.820 に答える
0

内部クエリが多くの行を返す場合は、IN 演算子を使用しないでください。また、count(*) は count(id) よりもかなり遅くなります。

これはより速いかもしれません:

SELECT emp.*
  FROM emp_details emp
    WHERE exists (SELECT a 
                    from emp_details
                    where e = emp.e
                    group by e
                      having count(a) = 1
                 );
于 2012-07-04T12:54:42.413 に答える