2017-10-13 11 views
0

nur auf meine previous question folgend, frage ich mich, wie ich Zeilen abrufen kann, wo es ähnliche Werte gibt, das heißt, wenn 2 Spiele 2 oder mehr gemeinsame Themen hatten.Finden, wenn 2 Varrays ähnliche Werte haben

Nach einigen Online-Graben, ich dachte, die Abfrage unten war so nah wie ich kann .. aber es funktioniert offensichtlich nicht. Die Kommentare in meiner vorherigen Frage funktionieren möglicherweise, wenn ich die Themen festlege, nach denen ich suche.

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 

Antwort

1

Wenn Sie eine Sammlung verwenden, anstatt ein VARRAY dann sind Sie nicht auf die Anzahl der Themen beschränkt können Sie speichern und Sie können den MULTISET INTERSECT [ALL|DISTINCT] Operator und die CARDINALITY Funktion:

SQL Fiddle

Oracle 11g R2 Schema Einrichtung:

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')) 
/

Abfrage 1:

SELECT * 
FROM game_table a 
     INNER JOIN 
     game_table b 
     ON (
     a.title < b.title 
     AND 
     CARDINALITY(a.GameTheme MULTISET INTERSECT b.GameTheme) > 1 
     ) 

Results:

| TITLE |  GAMETHEME | TITLE |  GAMETHEME | 
|--------|----------------|--------|----------------| 
| Game A |  Action,FPS | Game B | Action,FPS,P2W | 
| Game B | Action,FPS,P2W | Game C |  FPS,P2W | 

Wenn Sie es mit VARRAY s tun wollen, dann:

SQL Fiddle

Oracle 11g R2 Schema Setup:

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')) 
/

Abfrage 1:

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)) 
     ) 

Results:

| TITLE |  GAMETHEME | TITLE |  GAMETHEME | 
|--------|----------------|--------|----------------| 
| Game A |  Action,FPS | Game B | Action,FPS,P2W | 
| Game B | Action,FPS,P2W | Game C |  FPS,P2W |