sql-query来比较字符串的确切数目和内容

9wbgstp7  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(279)

我想编写一个查询,返回成对的图书(fèdoi,sèdoi),它们遵循以下标准:与sèdoi(第二本书)关联的关键字也都与fèdoi(第一本书)关联。
关键词

  1. Doi Keyword
  2. 1 'Adventure'
  3. 2 'Adventure'
  4. 1 'Fantasy'
  5. 2 'Thriller'
  6. 3 'Football'
  7. 4 'Football'
  8. 5 'History'

这是我的密码:

  1. select k1.doi f_DOI , k2.doi s_DOI, k1.keyword
  2. from keywords k1
  3. join keywords k2
  4. on k2.doi > k1.doi
  5. where k1.keyword= k2.keyword;

这是我的输出:

  1. f_DOI s_DOI KEYWORD
  2. 1 2 Adventure
  3. 3 4 Football

第一行是不正确的,你怎么能看到fèdoi=1和sèdoi=2只有共同的'冒险'关键字,其他两个是不同的(你怎么能看到在表中关键字doi=1也有关键字'幻想'和doi=2有关键字'颤栗')。

hrirmatl

hrirmatl1#

如果我理解正确的话,你似乎希望第二个是第一个的超级集合。那就是:

  1. with k as (
  2. select k.*, count(*) over (partition by doi) as cnt
  3. from keywords k
  4. )
  5. select k.doi, k2.doi
  6. from k join
  7. k k2
  8. on k2.keyword = k.keyword
  9. group by k.doi, k2.doi, k.cnt
  10. having count(*) = k.cnt;

如果你想要精确匹配,那么包括 k2.cnt = k.cnton 条款。
(假设没有重复项。)
编辑:
您可以使用以下方法获得完全相同的关键字:

  1. with k as (
  2. select k.*, count(*) over (partition by doi) as cnt
  3. from (select distinct keyword, doi from keywords k) k
  4. )
  5. select k.doi, k2.doi
  6. from k join
  7. k k2
  8. on k2.keyword = k.keyword and k2.cnt = k.cnt
  9. group by k.doi, k2.doi, k.cnt
  10. having count(*) = k.cnt;

或者 listagg() 方法:

  1. select keywords, listagg(doi, ',') within group (order by keyword)
  2. from (select doi,
  3. listagg(keyword, ',') within group (order by keyword) as keywords
  4. from (select distinct doi, keyword from keywords) k
  5. group by doi
  6. ) d
  7. group by keywords;

这可能受到oracle对字符串长度的限制。

展开查看全部
kxeu7u2r

kxeu7u2r2#

你可以用 listagg 具体如下:

  1. With cte as
  2. (Select t.doi, listagg(keyword,',') within group (order by keyword) as keyword
  3. from your_table t
  4. Group by t.id)
  5. Select distinct t1.doi f_doi, t2.id s_doi, t1.keyword
  6. From cte t1 join cte t2
  7. On t1.adventure = t2.adventure
  8. And t1.doi < t2.doi;

相关问题