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 |