我有以下两个表,pod_label
和service_selector
:
create table pod_label (
name varchar2(256),
key varchar2(256),
value varchar2(256)
);
insert into pod_label (name, key, value)
values ('p1', 'l1', '1');
insert into pod_label (name, key, value)
values ('p1', 'l2', '2');
insert into pod_label (name, key, value)
values ('p1', 'l3', '3');
insert into pod_label (name, key, value)
values ('p2', 'l1', '1');
insert into pod_label (name, key, value)
values ('p3', 'l1', 'N/A');
| 名称|关键字|价值|
| - -----|- -----|- -----|
| p1| L1| 1|
| p1| L2| 2|
| p1| L3| 3|
| P2| L1| 1|
| p3| L1|不适用|
create table service_selector (
name varchar2(256),
key varchar2(256),
value varchar2(256)
);
insert into service_selector (name, key, value)
values ('s1', 'l1', '1');
insert into service_selector (name, key, value)
values ('s1', 'l2', '2');
| 名称|关键字|价值|
| - -----|- -----|- -----|
| s1| L1| 1|
| s1| L2| 2|
我想在pod_label
中找到name
,使得相应的(key, value)
对是service_selector
中s1
对的超集。在上面的例子中,p1
是匹配的,而p2
和p3
不是。
一个直接的JOIN
不会这样做。有没有一种方法w/out诉诸PL/SQL函数?
2条答案
按热度按时间rvpgvaaj1#
您可以创建以下类型:
然后,您可以将值聚合到集合中,并使用
SUBMULTISET OF
运算符来比较集合,并确保其中一个是另一个的子集:对于样本数据,输出:
| 名称|关键字|价值|
| - -----|- -----|- -----|
| p1| L1| 1|
| p1| L2| 2|
| p1| L3| 3|
fiddle
bqjvbblv2#
你可以使用与本题相同的方法:SQL query: Simulating an "AND" over several rows instead of sub-querying。其思想是:
要将此方法外推到由某列标识的多个列表,您可以使用分析
count
和partition by
该列。对于此示例数据(由其他选择器扩展):
| 名称|关键字|价值|
| - -----|- -----|- -----|
| p1| L1| 1|
| p1| L2| 2|
| p1| L3| 3|
| P2| L1| 1|
| P2| L3| 3|
| p3| L1|不适用|
| 名称|关键字|价值|
| - -----|- -----|- -----|
| s1| L1| 1|
| s1| L2| 2|
| S2| L1| 1|
| S3| L1| 1|
| S3| L3|无|
返回:
| 服务名称|名称|关键字|价值|S_CNT| MATCH_CNT|
| - -----|- -----|- -----|- -----|- -----|- -----|
| s1| p1| L1| 1| 2| 2|
| s1| p1| L2| 2| 2| 2|
| S2| p1| L1| 1| 1| 1|
| S2| P2| L1| 1| 1| 1|
fiddle