2016-09-08 4 views
0

Ich habe 2 Tabellen: PROFESSOR und STUDENT. Beide haben eine LEVEL-Spalte, die einen "," begrenzten Wert enthält. Wenn ich einen STUDENT habe, wie kann ich eine Abfrage schreiben, um alle PROFESSORs Matches mindestens 1 STUDENT.LEVEL zurückzugeben?Oracle Join on Delimited String

Zum Beispiel:

STUDENT[1].LEVEL = '1,2' 
PROFESSOR[1].LEVEL = '2, 3' 
PROFESSOR[2].LEVEL = '2, 4' 

Ich möchte

+0

Also für Student 1, möchten Sie 2, 3 und 4 ...? Oder du 1 und 2? Sieht so aus, als hättest du schon 1 und 2 – kbball

+0

Ich möchte PROFESSOR [1] und PROFESSOR [2] zurückgeben. – topcan5

+0

Aber Sie haben das schon in student.level ..? Recht? Was würde die Abfrage tun? – kbball

Antwort

1

Als D Stanley beide PROFESSOR 1 und 2 zurückzukehren, sagte Sie Ihre Daten normalisieren müssen. Aber wie auch immer, Ihr Problem hat eine Lösung. Verwenden Sie REPLACE für das Löschen von Daten und REGEXP für Join.

-- data for example 
WITH 
student AS (
SELECT 'Jon' AS "name", '1,2' AS "level" FROM dual UNION ALL 
SELECT 'Bob' AS "name", '1,5' AS "level" FROM dual 
), 
professor AS (
SELECT 'M.Fowler' AS "name", '2, 3' AS "level" FROM dual UNION ALL 
SELECT 'E.Gamma' AS "name", '2, 4' AS "level" FROM dual 
) 
-- query 
SELECT s.*, p.* 
    FROM student s, 
     professor p 
WHERE REGEXP_LIKE(p."level", REPLACE(REPLACE(s."level",' ', ''), ',', '|'))