2016-06-15 5 views
0

私は、施設とこの場所で最も安いビールのリストを示すために必要なすべてのデータを集中するビューを持っています。SQL/Springデータ - 列と固有IDの最小値に基づいて完全な行を取得する方法

Table

行がマーク:時々私は私の見解は、ほぼ同じ結果とラインの多くを返し、ビールのラベルや梱包に応じて確立と安いビールの価格をフィルタリングする必要があるので、赤い四角は私が欲しいものです。絵で、私はいくつかの仕様にJpaSpecificationExecutorを使用していたとして、結果セットを取得するには、最終的にSQLはこれです:

SELECT 
    visaoaplic0_.id_estabelecimento , 
    visaoaplic0_.embalagem_id   , 
    visaoaplic0_.rotulo_id   , 
    visaoaplic0_.nome_cidade   , 
    visaoaplic0_.nome_embalagem  , 
    visaoaplic0_.nome_estabelecimento , 
    visaoaplic0_.nome_estado   , 
    visaoaplic0_.preco    , 
    visaoaplic0_.tipo_estabelecimento, 
    visaoaplic0_.icone    , 
    visaoaplic0_.icone_content_type 
FROM visao_app_aba_locais visaoaplic0_ 
WHERE upper(visaoaplic0_.nome_cidade) = 'MONTES CLAROS' AND  upper(visaoaplic0_.nome_estado) = 'MINAS GERAIS' AND 
    (upper(visaoaplic0_.nome_estabelecimento) LIKE '%') AND 
    (visaoaplic0_.tipo_estabelecimento IN (1006, 1053, 1148, 1008, 1009, 1007)) AND 
    (visaoaplic0_.id_estabelecimento IS NOT NULL); 

問題は今どちらも、私は私が必要な行だけを取得する方法が分からないということではありませんSQLを使用するか、基準APIを使用します。答え

について

私はあなただけのSQLでこれを解決する方法を知っていれば、(おそらくSQLに:2011)は、データベース・ベンダーの独立した文を表示してください、使用JPQLや基準のAPIが必要になりますので、私はJPQLまたはCriteria APIに翻訳できます。

答えて

0

だから、SQLにすることもできないこともできますか?ここにいくつかのSQLバージョンがありますが、ほとんどはSQL Server用ですが、カップルは何でも使えます。

単に先頭に行を移動するためのオプションは:

SELECT 
    visaoaplic0_.id_estabelecimento , 
    visaoaplic0_.embalagem_id   , 
    visaoaplic0_.rotulo_id   , 
    visaoaplic0_.nome_cidade   , 
    visaoaplic0_.nome_embalagem  , 
    visaoaplic0_.nome_estabelecimento , 
    visaoaplic0_.nome_estado   , 
    visaoaplic0_.preco    , 
    visaoaplic0_.tipo_estabelecimento, 
    visaoaplic0_.icone    , 
    visaoaplic0_.icone_content_type 
    ,RowNum = ROW_NUMBER() OVER (PARTITION BY visaoaplic0_.id_estabelecimento ORDER BY 
    IIF(visaoaplic0_.preco IS NULL,1,0) ASC 
    ,ISNULL(visaoaplic0_.preco,0) ASC 
    ) 
FROM visao_app_aba_locais visaoaplic0_ 
WHERE upper(visaoaplic0_.nome_cidade) = 'MONTES CLAROS' AND  upper(visaoaplic0_.nome_estado) = 'MINAS GERAIS' AND 
    (upper(visaoaplic0_.nome_estabelecimento) LIKE '%') AND 
    (visaoaplic0_.tipo_estabelecimento IN (1006, 1053, 1148, 1008, 1009, 1007)) AND 
    (visaoaplic0_.id_estabelecimento IS NOT NULL) 
ORDER BY 
    RowNum 
; 

テストデータとして存在するだけではnullの場合よりも良いのNullの扱い次のクエリ共通テーブル式と

DECLARE @Table AS TABLE (Establishment VARCHAR(100), Price MONEY) 
INSERT INTO @Table (Establishment, Price) 
VALUES ('A',4.5),('B',5.5),('B',3.05),('C',6.75), ('D',NULL), ('C',NULL) 

ウィンドウ表示機能について最初の価格?

;WITH cteQuery AS (
    SELECT 
     * 
     ,RowNumber = ROW_NUMBER() OVER (PARTITION BY Establishment ORDER BY 
      IIF(Price IS NULL, 1, 0) ASC 
      ,ISNULL(Price,0) ASC) 
    FROM 
     @Table 
) 

SELECT 
    Establishment 
    ,Price 
FROM 
    cteQuery 
WHERE 
    RowNumber = 1 

その他のオプション

----Windowed Function with Common Table Expression 
;WITH cteQuery AS (
    SELECT 
     * 
     ,RowNumber = ROW_NUMBER() OVER (PARTITION BY Establishment ORDER BY ISNULL(Price,0) ASC) 
    FROM 
     @Table 
) 

SELECT 
    Establishment 
    ,Price 
FROM 
    cteQuery 
WHERE 
    RowNumber = 1 


--- Group By with Common Table Expression Method 
;WITH cteMin AS (
    SELECT 
     Establishment 
     ,MinPrice = MIN(ISNULL(Price,0)) 
    FROM 
     @Table 
    GROUP BY 
     Establishment 
) 

SELECT 
    t.* 
FROM 
    cteMin m 
    INNER JOIN @Table t 
    ON m.Establishment = t.Establishment 
    AND m.MinPrice = ISNULL(t.Price,0) 



-----Group By with Sub Select Method 
SELECT 
    t.* 
FROM 
    @Table t 
    INNER JOIN (
     SELECT 
      Establishment 
      ,MinPrice = MIN(ISNULL(Price,0)) 
     FROM 
      @Table 
     GROUP BY 
      Establishment 
    ) g 
    ON t.Establishment = g.Establishment 
    AND ISNULL(t.Price,0) = g.MinPrice 
+0

、このような答えは、SQLにすることができますが、私はJPQLまたは基準クエリでそれを変換する必要があります、データベースの特定のクエリは助けにはなりません。 – brevleq

関連する問題