KDB中lateral join的等价操作及数组值列展开方法咨询
Hey there! Let's tackle your questions about kdb+ equivalents to PostgreSQL's lateral join and unnesting array columns—they're closely linked, so I'll walk you through both with concrete examples.
1. The Direct Lateral Join Equivalent: ungroup
In PostgreSQL, you use lateral join (often paired with unnest) to split a row with an array column into multiple rows—one for each element in the array—while preserving all other original row values.
In kdb+, the ungroup function does exactly this out of the box. Let's use your table T with array column C as an example:
First, create a sample table to test with:
T: ([] id: 1 2 3; C: (10 20; 30; 40 50 60))
To unnest column C (matching the behavior of a PostgreSQL lateral join with unnest), simply run:
ungroup T
This outputs:
id C ----- 1 10 1 20 2 30 3 40 3 50 3 60
This is exactly the result you'd get from a PostgreSQL lateral join unnesting the array column.
If your table has multiple array columns and you only want to unnest one, specify it explicitly:
ungroup[;`C] T
2. Flexible Custom Logic: Using each
If you need to add custom processing while unnesting (like you might do with a subquery in a lateral join), use the each iterator to handle each row individually, then combine the results.
For example, let's unnest C and calculate a new value using each array element and the row's id:
// Process each row to create expanded rows with custom logic expandedRows: {[row] ([] id: enlist row[`id]; C: row[`C]; calculated: row[`C] + row[`id]) } each T // Combine all expanded rows into a single table ,/ expandedRows
This gives you:
id C calculated ---------------- 1 10 11 1 20 21 2 30 32 3 40 43 3 50 53 3 60 63
This mimics the flexibility of a lateral join where you can run custom subqueries per row.
Quick Tips
- If your array column contains empty lists,
ungroupwill drop those rows entirely. To keep them (with a null value for the array element), first replace empty lists with a single null element:T: update C: $[0=count each C; enlist ::; C] from T ungroup T
内容的提问来源于stack exchange,提问作者JSLover

