将一个表中的多个值与另一个表中的多个值进行比较
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
【讨论】:
以上是关于将一个表中的多个值与另一个表中的多个值进行比较的主要内容,如果未能解决你的问题,请参考以下文章
获取单个变量中的多个值并使用它与另一个变量中的单个值进行比较
SQL Server:交叉引用一个表中的多个列与另一个表中的多个列
SQL 表中如何让某条记录的某个属性值与另一个表中的某条记录的某个属性值相关联