Google spreadsheet “=QUERY” join() equivalent function?

ⅰ亾dé卋堺 提交于 2019-11-27 10:55:38

Short answer

Google QUERY Language version 0.7 (2016) doesn't include a JOIN (LEFT JOIN) operator but this could be achived by using an array formula which result could be used as input for the QUERY function or for other uses.

Explanation

Array formulas and the array handling features of Google Sheets make possible to make a JOIN between two simple tables. In order to make easier to read, the proposed formula use named ranges instead of range references.

Named Ranges

  • table1 : Sheet1!A1:C3
  • table2 : Sheet2!A1:C3
  • ID : Sheet1!A1:A3

Formula

=ArrayFormula(
   {
     table1,
     vlookup(ID,table2,COLUMN(Indirect("R1C2:R1C"&COLUMNS(table2),0)),0)
   }
)

Remarks:

  • Using open ended ranges is possible but this could make the the spreadsheet slower.
  • To spead up the recalculation time :
    1. Replace Indirect("R1C2:R1C"&COLUMNS(table2),0) by an array of constants from 2 to number of columns of table2.
    2. Remove the empty rows from the spreasheet

Example

See this sheet for an example

Note

On 2017 Google improved the official help article in English about QUERY, QUERY function. It still doesn't include yet topics like this but could be helpful to understand how it works.

White_King

You can use ARRAYFORMULA or YOU can just drag this formula: after an import or QUERY-ing the first table; in the D column:

=QUERY(Sheet2!A1:C3, "Select B,C WHERE A='" & A1 & "'", 0)

So, this answers how you do it WITH a Vlookup-function, but in only one cell.
In your example, given that each table of data has the following cell references:

Table1: Sheet1!A1:C3

a d g
b e h
c f i

Table2: Sheet2!A1:C3

c j m
a k n
b l o

This is how the formula should be constructed.

Join-formula

=ArrayFormula(
   {
     Sheet1!A1:C,
     vlookup(Sheet1!A1:A, {Sheet2!A1:A, Sheet2!B1:C}, {2,3}, false)
   }
)

The key to get this formula to work, is to understand how to use curly brackets in the Vlookup Range. You basically define the first cell reference of the Range as the column which is to be a match to the Vlookup Search_Key. The rest of the cell references in the Range is in relation to the columns which you would like to join.

The Index is written as {2,3} to return the second and third column of the Range (the Range consists of a total of 3 columns); curly brackets has nothing to do with Arrayformula in the Vlookup Index, but is necessary to return multiple columns from the Vlookup function. The reason to not write {1,2,3} is because you would not like to include the column which is being used for the purpose of joining.

Example where the column in table2 used for joining, is located in a different column (to the right of the data which is to be joined)

This kind of Join-formula can be utilized even if the join-column in the second table is located as the third column of that table. Let's say that the raw-data in this example would look like this:

Table1 (Sheet1):

a d g
b e h
c f i

Table2 (Sheet2):

j m c
k n a
l o b

If you write the formula like this, you'll still get the desired outcome (as displayed in the table of joined data):

=ArrayFormula(
   {
     Sheet1!A1:C,
     vlookup(Sheet1!A1:A, {Sheet2!C1:C, Sheet2!A1:B}, {2,3}, false)
   }
)

The table of joined data:

a d g k n
b e h l o 
c f i j m

In the Join-formula, notice that the third column of Table2 is located as the first cell reference in the Vlookup Range!
The reason to why this works, is because when you use curly brackets in the Range (in conjunction with Arrayformula), the Vlookup Search_Key will NOT look for a column as a common denominator within the raw-data, instead it will use the Array within curly brackets as a reference to find a column as a common denominator (by default this is the first column of the Range).

I've written a comprehensive guide about this topic called:

'Mastering Join-formulas in Google Sheets'

If you can map each "index" (a, b, c) to a specific row or column, then you could use the INDEX function.

In this case, you could probably map 'a' to column A (or row 1), 'b' to column B (or row 2), and so on.

Also, Merge Tables seem to address this exact use case.

With the 'other' table in A5:C7, please try:

=query({A1:C3,query(sort(A5:C7,1,TRUE),"Select Col2,Col3")})
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!