8

次のテーブル名 JobTitle があります

JobID LanaguageID
-----------------
1         1
1         2
1         3
2         1
2         2 
3         4
4         5
5         2

カウント > 1 の重複した JobID を除いて、テーブルからすべてのレコードを選択しています。重複した JobID から 1 つのレコード/最初の行のみを選択しています。現在、LanguageID をパラメーターとしてストアド プロシージャに渡しています。また、その languageID の重複した JobID を他のレコードと共に選択したいと考えています。languageID を 1 として渡した場合、出力は次のようになります。

JobID LanaguageID
-----------------
1         1
2         1
3         4
4         5
5         2

次のクエリを使用してみました。

with CTE_RN as
(
    SELECT ROW_NUMBER() OVER(PARTITION BY JobTitle.JobID ORDER BY JobTitle.JobTitle) AS RN
    FROM JobTitle
    INNER JOIN JobTitle_Lang
        ON JobTitle.JobTitleID = JobTitle_Lang.JobTitleID
)

しかし、上記のクエリで WHERE 句を使用できません。別のアプローチに従う必要がありますか。または、クエリを変更して目的の出力を取得するにはどうすればよいですか

4

2 に答える 2

9
with CTE_RN as
(
    SELECT
        JobID, LanaguageID,
        ROW_NUMBER() OVER(PARTITION BY JobTitle.JobID ORDER BY JobTitle.JobTitle) AS RN
    FROM JobTitle
        INNER JOIN JobTitle_Lang ON JobTitle.JobTitleID = JobTitle_Lang.JobTitleID
)
select
from CTE_RN
where RN = 1 or LanguageID = @LanguageID

アップデート

少し単純化されていますが(結合が削除されています)、アイデアが得られます:

declare @LanguageID int = 2

;with cte_rn as
(
    select
        JobID, LanguageID,
        row_number() over(
          partition by JobTitle.JobID
          order by
              case when LanguageID = @LanguageID then 0 else 1 end, 
              LanguageID
        ) as rn
    from JobTitle
)
select *
from cte_rn
where rn = 1

sql fiddle demo

于 2013-09-24T17:07:10.497 に答える
3
SELECT b.[JobID], b.[LanaguageID]
FROM
  (SELECT a.[JobID], a.[LanaguageID],
    ROW_NUMBER() OVER(PARTITION BY a.[JobID] ORDER BY a.[LanaguageID]) AS [row]
  FROM [JobTitle] a) b
WHERE b.[row] = 1

結果

| | ジョビッド | LANAGUAGEID |
------|-------------|
| | 1 | 1 |
| | 2 | 1 |
| | 3 | 4 |
| | 4 | 5 |
| | 5 | 2 |

デモを見る

于 2013-09-24T17:08:03.553 に答える