2

SQL Oracle:列内の特定のIDに一致するレコードを見つける方法を参照してください

これで、私のクエリは同様の行にあります。私のテーブルには次のデータがあります。ここに画像の説明を入力してください

ここで、3つの値の組み合わせとしてasso_entity_idを持つレコードを検索したいと思います。例:-jspからasso_entitiesを30000、30001、80002(任意の順序)として選択すると、上記のテーブルの最初のレコードを取得する必要があります。

4

3 に答える 3

1

クエリを確認してください... 少し長いです... 短くしようとします。

with test as  (
  select * from YOURTABLE
)
SELECT distinct DATASETNAME FROM(
  select x.*, COUNT(*) OVER (partition by DATASETNAME ORDER BY DATASETNAME) CNT From(
    select DATASETNAME, regexp_substr (ASSO_ENTITY_ID, '[^|]+', 1, row_number() OVER (partition by DATASETNAME ORDER BY DATASETNAME)) split  
    from test  
    connect by level <= length (regexp_replace (ASSO_ENTITY_ID, '[^|]+'))  + 1
  )x where SPLIT IS NOT NULL
)xx 
  WHERE SPLIT IN ('300000', '300001', '800002') AND
  CNT =3;
于 2013-03-06T12:33:24.197 に答える
0

techdo の例の少し単純化されたバージョン:

これはテスト テーブルの構造です。

ID  DATASET_NAME    DATASET_VAL
------------------------------------------
1   DATASET1        3000 | 30001 | 80002
2   DATASET1        3000 | 80002
3   DATASET1        3000 | 80002


SELECT LISTAGG(str, ' | ') WITHIN GROUP (ORDER BY str) asso_ety_id
  FROM
  (
   SELECT DISTINCT id, dataset_name
        , TRIM(REGEXP_SUBSTR (dataset_val, '[^|]+', 1, LEVEL)) str  
    FROM your_tab 
   CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(dataset_val, '[^|]+'))  + 1
  )
  WHERE str IN ('80002', '30001', '3000') -- in any order --
   -- AND id = 1 -- optional --
  /

出力:

3000 | 30001 | 80002
于 2013-03-06T15:10:06.437 に答える
0

前の質問に対する私の回答に続き、実行している基になるクエリを確認できるため、それを例として使用し続けますlistagg...複数の値で一致し、一致した数を数え、さらにフィルターを適用できますあなたがそれらすべてに一致したことを確認します。何かのようなもの:

select distinct role_id, role_name, active, companyName, permission_id,
    permission_name, rn, total_rows, roleCreated
from (
    select t.*,
        count(raw_permission_id) over (partition by role_id) as cnt
    from (
        select r.role_id, 
            r.role_name, 
            r.active, 
            decode(r.entity_type_id, 1000, m.name, 3000, cour.name,
                4000, 'Ensenda') companyName,
            p.permission_id as raw_permission_id,
            listagg(p.permission_id, ' | ')
                within group (order by p.permission_id)
                    over (partition by r.role_id) permission_id, 
            listagg(p.permission_name, ' | ')
                within group (order by p.permission_id)
                    over (partition by r.role_id) permission_name, 
            dense_rank() over (order by r.created_ts desc) as rn,
            count(distinct r.role_id) over () as total_rows, 
            r.created_ts roleCreated
        from t_role r
        left join t_role_permission rp ON r.role_id = rp.role_id
        left join t_permission p ON rp.permission_id = p.permission_id
        left join merchant m on r.entity_id = m.merchantkey 
        left join courier cour on r.entity_id = cour.courierkey 
    ) t
    where raw_permission_id in (301446, 301445)
)
where cnt = 2
and rn between 1 and 100
order by roleCreated desc;

前の回答との唯一の違いは、クエリの外側の 2 つのレイヤーです。

select ...
from (
    select t.*,
        count(raw_permission_id) over (partition by role_id) as cnt
    from (
    ... -- no changes here
    ) t
    where raw_permission_id in (301446, 301445)
)
where cnt = 2
...

そこで、2 つの可能性のある権限を探して、分析的に、役割ごとに、一致した数を数えます。外側のクエリは、一致した数が 2 であることを確認します。これは、一致させようとしているオプションの数に応じて明らかに調整する必要があります。

この質問の場合、次のようなものが追加されます。

        count(raw_asso_entity_id) over (partition by <some_id>) as cnt
    ...
    where raw_asso_id in (30000, 30001 and 80002)
...
where cnt = 3
于 2013-03-06T13:20:55.843 に答える