Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找两个varray是否具有相似的值_Sql_Oracle - Fatal编程技术网

Sql 查找两个varray是否具有相似的值

Sql 查找两个varray是否具有相似的值,sql,oracle,Sql,Oracle,接下来,我想知道如何检索具有相似值的行,即如果两个游戏有两个或更多共同主题 在网上进行了一些挖掘之后,我认为下面的查询是我能得到的最接近的。。但它显然不起作用。如果我指定了我要寻找的主题,我上一个问题中的评论可能会起作用 select title from (select c.*, count(table(c.gametheme)) over (partition by table(c.gametheme)) as theme_count from game_table c) WHERE th

接下来,我想知道如何检索具有相似值的行,即如果两个游戏有两个或更多共同主题

在网上进行了一些挖掘之后,我认为下面的查询是我能得到的最接近的。。但它显然不起作用。如果我指定了我要寻找的主题,我上一个问题中的评论可能会起作用

select title
from (select c.*, count(table(c.gametheme)) over (partition by 
table(c.gametheme)) as theme_count
from game_table c)
WHERE theme_count > 1

如果使用集合而不是VARRAY,则不限于可以存储的主题数量,还可以使用MULTISET INTERSECT[ALL | DISTINCT]操作符和基数函数:

Oracle 11g R2架构设置:

问题1:

如果要使用varray执行此操作,请执行以下操作:

Oracle 11g R2架构设置:

问题1:

CREATE OR REPLACE TYPE Varchar20List AS TABLE OF VARCHAR2(20)
/ 

CREATE OR REPLACE TYPE Game_Type AS OBJECT(
  Title VARCHAR2(50),
  GameTheme Varchar20List
)
/
CREATE TABLE Game_Table of Game_Type
NESTED TABLE GameTheme STORE AS GameTheme_tab
/
INSERT INTO Game_Table
VALUES('Game A' , Varchar20List( 'Action', 'FPS') )
/
INSERT INTO Game_Table
VALUES('Game B' , Varchar20List( 'Action', 'FPS', 'P2W') )
/
INSERT INTO Game_Table
VALUES('Game C' , Varchar20List( 'FPS', 'P2W' ) )
/
SELECT *
FROM   game_table a
       INNER JOIN
       game_table b
       ON (
         a.title < b.title
         AND
         CARDINALITY( a.GameTheme MULTISET INTERSECT b.GameTheme ) > 1
       )
|  TITLE |      GAMETHEME |  TITLE |      GAMETHEME |
|--------|----------------|--------|----------------|
| Game A |     Action,FPS | Game B | Action,FPS,P2W |
| Game B | Action,FPS,P2W | Game C |        FPS,P2W |
CREATE OR REPLACE TYPE Varchar20List AS VARRAY(3) OF VARCHAR2(20)
/ 

CREATE OR REPLACE TYPE Game_Type AS OBJECT(
  Title VARCHAR2(50),
  GameTheme Varchar20List
)
/
CREATE TABLE Game_Table of Game_Type
--NESTED TABLE GameTheme STORE AS GameTheme_tab
/
INSERT INTO Game_Table
VALUES('Game A' , Varchar20List( 'Action', 'FPS') )
/
INSERT INTO Game_Table
VALUES('Game B' , Varchar20List( 'Action', 'FPS', 'P2W') )
/
INSERT INTO Game_Table
VALUES('Game C' , Varchar20List( 'FPS', 'P2W' ) )
/
SELECT *
FROM   game_table a
       INNER JOIN
       game_table b
       ON (
         a.title < b.title
         AND
         2 <= ( SELECT COUNT(*)
                FROM   TABLE( a.GameTheme ) ag
                       INNER JOIN TABLE( b.GameTheme ) bg
                       ON ( ag.COLUMN_VALUE = bg.COLUMN_VALUE ) )
       )
|  TITLE |      GAMETHEME |  TITLE |      GAMETHEME |
|--------|----------------|--------|----------------|
| Game A |     Action,FPS | Game B | Action,FPS,P2W |
| Game B | Action,FPS,P2W | Game C |        FPS,P2W |