0

У меня есть скрипт хранимой функции PL/SQL, который я пишу, и у меня возникла проблема.Сравнение нескольких значений из одной таблицы в несколько значений в другую

Мне нужно найти ВСЕ Заявителей, которые обладают ВСЕМИ навыками, необходимыми для задачи и отображают их.

У меня есть метод, когда я индивидуально читаю навыки Абиантанта в строку VARCHAR2 и все навыки, необходимые для другого. Если бы я мог разделить эти строки на отдельные слова, я мог бы сравнить их с LIKE '% <data> %'.

Как я могу это сделать (или альтернативный метод)?

CREATE OR REPLACE FUNCTION FUBARR(num IN NUMBER) RETURN VARCHAR IS 
    string_position VARCHAR2(128); 
    string_applicant VARCHAR2(128); 
    string_results VARCHAR2(128); 
BEGIN 
    string_position := ''; 
    string_applicant := ''; 


    FOR SKILLS_row IN (SELECT sname FROM SNEEDED WHERE pnumber = num) 
    LOOP 
    string_position := string_position || SKILLS_row.sname || ' '; 
    END LOOP; 

    FOR EVERYBODY_row IN (SELECT UNIQUE anumber FROM SPOSSESSED ORDER BY anumber) 
    LOOP 
    FOR APPLICANTS_row IN (SELECT sname FROM SPOSSESSED WHERE SPOSSESSED.anumber = EVERYBODY_row.anumber) 
    LOOP 
     string_applicant := string_applicant || APPLICANTS_row.sname || ' '; 
    END LOOP; 
    --DBMS_OUTPUT.PUT_LINE(EVERYBODY_row.anumber || ' ' || string_applicant); 


    --IF blaah != LIKE BLAh 
    IF 


    string_applicant := ''; 
    END LOOP; 


    --DBMS_OUTPUT.PUT_LINE(string_position); 
    --RETURN (string_position); 
    RETURN('help'); 
END FUBARR; 
/

ответ

1

почему бы не просто выбрать все spossesed - записи, где количество связанных с ними навыков желаемого num равно равнинной числу sneeded - навыки этого num:

SELECT * 
    FROM SPOSSESSED sp 
WHERE (SELECT COUNT(*) FROM SNEEDED s 
     WHERE s.pnumber = num) = 
     (SELECT COUNT(*) FROM SNEEDED s 
      JOIN SPOSSESSED p ON p.sname = s.sname 
     WHERE s.pnumber = num and p.anumber = sp.anumber) 

или с помощью Любая конструкция:

SELECT sp.anumber, COUNT(*) 
    FROM SPOSSESSED sp 
WHERE sp.sname = ANY (SELECT s.sname FROM SNEEDED s WHERE s.pnumber = num) 
GROUP BY sp.anumber 
Смежные вопросы