将一个表中的多个值与另一个表中的多个值进行比较

Posted

技术标签:

【中文标题】将一个表中的多个值与另一个表中的多个值进行比较【英文标题】:Comparing Multiple Values from one table to Multiple Values in another 【发布时间】:2016-04-21 09:37:16 【问题描述】:

我正在编写一个 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 的关联技能数等于该 num 的 sneeded - 技能的普通数量:

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)

或使用 ANY 构造:

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

【讨论】:

以上是关于将一个表中的多个值与另一个表中的多个值进行比较的主要内容,如果未能解决你的问题,请参考以下文章