首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在显示所有包含A的B的两个表之间创建内连接?

是否可以在显示所有包含A的B的两个表之间创建内连接?
EN

Stack Overflow用户
提问于 2019-09-26 20:26:52
回答 3查看 276关注 0票数 1

我有两个表:汉字和词汇表。想象一下汉字表是这样的:

代码语言:javascript
复制
目
一
人

词汇表如下所示:

代码语言:javascript
复制
目的
一番目
一人
二人
人々
注目
目標
一匹

我想生成一个表,找到汉字表中包含汉字的所有词汇表,并将它们一起列出。因此,最终结果如下所示:

代码语言:javascript
复制
人   一人
    二人
    人々
一   一人
    一番目
    一匹
目   目的
    一番目
    注目
    目標

我不知道该怎么做。如果我只有一个汉字,我可以使用查询函数生成包含这个汉字的所有词汇表。但是,我是否可以创建一个动态表,将“汉字”和“词汇”表内部连接起来,查找“词汇”包含“汉字”的每个实例?

我尝试使用查询来合并这两个表,但它不起作用,因为这两个表的大小不匹配:

代码语言:javascript
复制
=QUERY({C1:C296,D1:D224}, "SELECT Col2 WHERE Col1 contains Col2")

在上面的示例中,C列/ Col2是词汇,D列/ Col1是汉字。

有没有办法使用Google Sheets来做到这一点?

EN

回答 3

Stack Overflow用户

发布于 2019-09-26 22:47:43

最简单的解决方法是按1个值获取交叉点:

=FILTER(D:D;REGEXMATCH(D:D;"目"))

图中显示了如何使用此函数的副本获取所有交叉点

另一种方法是使用大的数组公式,比如:

=TRANSPOSE(SPLIT(TEXTJOIN(",";1;TRANSPOSE(ARRAYFORMULA(IF(REGEXMATCH(A1:A8;TRANSPOSE(B1:B3));A1:A8;))));","))

票数 1
EN

Stack Overflow用户

发布于 2019-09-27 05:14:16

代码语言:javascript
复制
=ARRAYFORMULA(SORT(TRIM(SPLIT(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE(
 IF(IFERROR(REGEXEXTRACT(IFERROR(REGEXEXTRACT(C1:C, REPT("(.)", LEN(C1:C)))), 
 TEXTJOIN("|", 1, A1:A)))<>"", "♦"&IFERROR(REGEXEXTRACT(IFERROR(
 REGEXEXTRACT(C1:C, REPT("(.)", LEN(C1:C)))), TEXTJOIN("|", 1, A1:A)))&"♣"&C1:C, ))
 ,,999^99)),,999^99), "♦")), "♣"))))

票数 1
EN

Stack Overflow用户

发布于 2020-06-30 02:23:34

说真的,更好的方法就是添加一个自定义函数:

代码语言:javascript
复制
/**
 * inner join on equality 
 *
 * @param {Range} items1 Table 1
 * @param {Range} items2 Table 2
 * @param {Integer} ix1 0-based index of key in Table1
 * @param {Integer} ix2 0-based index of key in Table2
 *
 * @customfunction

 * @author marc meyer (marqueymarc)
 */
function innerJoinEQ(items1 = [[]], items2 = [[]], ix1= 0, ix2= 0) {
  var res = [];
  var item2ix = 0;
  var map = new Map();

  items1 = Array.isArray(items1)? items1: [[items1]];
  items2 = Array.isArray(items2)? items2: [[items2]];
  
  items2.forEach((item2) => {
    let entries = map.get(item2[ix2]) || [];
    entries.push(item2);
    map.set(item2[ix2], entries);
  });
  items1.forEach((item1) => {
    let entries = map.get(item1[ix1]) || [];
    entries.forEach((rightPart) => {
      let cp = rightPart.slice();
      cp.splice(ix2, 1);
      res.push([...item1, ...cp]);
    })
  });
  return res;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58116794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档