{"id":7405,"date":"2019-02-16T10:30:55","date_gmt":"2019-02-16T10:30:55","guid":{"rendered":"https:\/\/www.version1.com\/en-us\/?p=7405"},"modified":"2019-02-16T10:30:55","modified_gmt":"2019-02-16T10:30:55","slug":"kdb-joins-for-beginners","status":"publish","type":"post","link":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/","title":{"rendered":"kdb+: Joins for Beginners"},"content":{"rendered":"<p>I was recently given the opportunity to learn kdb+ and, coming from a Sybase-flavoured SQL background, there were plenty of new concepts to learn. Some I was already familiar with \u2013 especially when it came to joins.<\/p>\n<p>The joins I knew and loved so well from SQL were all available in kdb+, so they were easy to for me to get to grips with. However, there were a few new joins that I\u2019d never heard of before, like the as-of join. These joins are especially powerful in the financial world, and it took me some time to wrap my head around them.<\/p>\n<p>I decided to write a blog that a qbie like myself wished they had when they came to study kdb+ joins \u2013 with the help of visuals I hope this guide is useful for other qbies. I have also attached a basic summary of Joins <a href=\"https:\/\/code.kx.com\/q\/basics\/joins\/\">here<\/a> which you may enjoy reading also.<\/p>\n<p>The table below shows the kdb+ joins that I will cover, as well as any SQL equivalent of the join (this is purely for reference, I will not be comparing exact like-for-like in this blog between kdb+ and SQL).<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/sqltab.png\" alt=\"\" loading=\"lazy\"><\/p>\n<h2><strong>kdb+ Table Structure<\/strong><\/h2>\n<p>Below is a quick visual to describe how kdb+ tables are displayed on the console, and how they will be formatted throughout this blog:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/structure-1.png\" alt=\"\" loading=\"lazy\"><\/p>\n<h2>Inner Join<\/h2>\n<p>This joins two tables based on the key column of the second table. The result has all the columns from table1, and any extra columns from table2 are appended on. The result table includes only combined rows from table1 and table2 where there are matching values in the common column that is keyed in table2, and it drops any rows that don\u2019t.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/syntax_ij.png\" alt=\"\" loading=\"lazy\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/ij.png\" alt=\"\" loading=\"lazy\"><\/p>\n<ul>\n<li>schema of trade is kept, then any new columns from quote (\u2018bid\u2019 and \u2018ask\u2019) are appended with their data<\/li>\n<li>any mutual columns (\u2018size\u2019) will have quote\u2019s data<\/li>\n<li>if any row\u2019s value from trade does not exist in quote\u2019s key, it will be dropped (i.e. in trade where sym=\u2019ORCL\u2019 and \u2018IBM\u2019)<\/li>\n<\/ul>\n<h2>Left Join<\/h2>\n<p>Left join takes two tables and joins them based on the key column of the second table. The result is all rows from table1 combined with either updated or additional data coming from table2. The result table always has the same row count as table1.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/syntax_lj.png\" alt=\"\" loading=\"lazy\"><br \/>\n<img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/lj.png\" alt=\"\" loading=\"lazy\"><\/p>\n<ul>\n<li>the structure of trade is kept and additional columns from quote are joined on<\/li>\n<li>values from trade are overwritten by values from quote for the mutual column (\u2018size\u2019) where there is a match on quote\u2019s key (sym=\u2019GOOG\u2019 and \u2018MSFT\u2019)<\/li>\n<li>values from quote for columns \u2018bid\u2019 and \u2018ask\u2019 are joined where there is a match on quote\u2019s key<\/li>\n<li>nulls are used to fill where there is no match on quote\u2019s key (sym=\u2019ORCL\u2019 and \u2018IBM\u2019)<\/li>\n<li>the row from quote where sym=\u2019TSLA\u2019 is dropped as this value is unique to quote<\/li>\n<\/ul>\n<h2>Using lj to mimic SQL\u2019s \u201cRight Join\u201d<\/h2>\n<p>The equivalent of SQL\u2019s right join can be achieved by reversing the order of the tables in the left join:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/rj.png\" alt=\"\" loading=\"lazy\"><\/p>\n<p>The above image is how you would achieve SQLs \u201ctrade RIGHT JOIN quote\u201d in kdb+. As you can see, SQL\u2019s right join is just a left join in disguise!<\/p>\n<h2>Equi Join<\/h2>\n<p>The equi join takes two tables and allows you to specify which mutual columns you want them to be joined on. The result combines all rows from table2 that match table1 on the specified columns.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/syntax_ej.png\" alt=\"\" loading=\"lazy\"><br \/>\n<img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/ej.png\" alt=\"\" loading=\"lazy\"><\/p>\n<ul>\n<li>the only syms that match between trade and quote are \u2018GOOG\u2019 and \u2018MSFT\u2019<\/li>\n<li>values are taken from quote for the mutual column to both tables (\u2018size\u2019)<\/li>\n<li>two \u2018GOOG\u2019 rows are returned as there are two in quote\n<ul>\n<li>if an inner join was used, only the first \u2018GOOG\u2019 row from quote would be returned<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Having any of the input tables keyed doesn\u2019t make a difference to the output of equi join.<\/p>\n<h2>Union Join<\/h2>\n<p>Union join combines all columns and rows from both tables. Common columns are merged, and new columns are appended and filled with nulls. The union join behaves differently depending on whether the tables are keyed, so let\u2019s have a look at both\u2026<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/syntax_uj.png\" alt=\"\" loading=\"lazy\"><\/p>\n<h2><strong>Keyed uj<\/strong><\/h2>\n<p>When tables are keyed, the matching rows are updated.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/ujK.png\" alt=\"\" loading=\"lazy\"><\/p>\n<ul>\n<li>\u2018GOOG\u2019 and \u2018MSFT\u2019 are keys in both tables, so the rows combine as shown\n<ul>\n<li>columns present in both tables take their values from quote (for \u2018MSFT\u2019, size=50 instead of 30)<\/li>\n<\/ul>\n<\/li>\n<li>syms \u2018ORCL\u2019 and \u2018IBM\u2019 only exist in trade, and \u2018TSLA\u2019 only exists in quote, so they don\u2019t have any updated values in the result\n<ul>\n<li>e.g. for sym=\u2019ORCL\u2019, the \u2018bid\u2019 column is filled with a null in the result set<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2><strong>Unkeyed uj<\/strong><\/h2>\n<p>When tables are not keyed, the tables are simply appended to each other.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/ujUK.png\" alt=\"\" loading=\"lazy\"><\/p>\n<ul>\n<li>result table has trade\u2019s schema with any extra columns from quote appended<\/li>\n<li>values from trade are kept under their respective columns, with nulls filling new columns from quote (i.e. the \u2018ask\u2019 column)<\/li>\n<li>rows from quote are appended after the rows from trade, again with nulls used for non-mutual columns from trade (i.e. the \u2018price\u2019 column)<\/li>\n<\/ul>\n<h2>kdb+ Pioneered Joins<\/h2>\n<p>Working in capital markets I wondered where the new join concepts had been all my life. The as-of join and the window join which allow for non-equality-based matching are so useful on a day to day basis that I hope everyone can use this blog to harness their power. These joins have been so influential that the likes of Pandas, Apache Spark and R have implemented their own versions.<\/p>\n<h2><strong>As-of Join<\/strong><\/h2>\n<p>The as-of join matches two tables on a given column (e.g. sym) and returns the rows equal to or before another given column (e.g. time). The example below explains how it works.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/syntax_aj.png\" alt=\"\" loading=\"lazy\"><\/p>\n<p>There are many ways of using this join, but the most common is when you would like to know the latest quote on the market when a trade was done:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/aj.png\" alt=\"\" loading=\"lazy\"><\/p>\n<ul>\n<li>result table contains all columns from trade and quote tables<\/li>\n<li>for VOD, it finds the last row from quote as-of the time of the trade (12:02), i.e. the last bid\/ask\u00a0at or before\u00a0time 12:02\n<ul>\n<li>since there is no quote at 12:02, it joins the quote (bid\/ask) from 12:01<\/li>\n<li>this ignores where time is 12:03 in quote since this time is greater than 12:02<\/li>\n<\/ul>\n<\/li>\n<li>for BT, finds the last quote as-of 12:04\n<ul>\n<li>however, this time there is a quote for that exact time, so it joins the bid\/ask from 12:04<\/li>\n<li>again, time at 12:05 in quote is ignored<\/li>\n<\/ul>\n<\/li>\n<li>there is no quote for TSCO,\u00a0so the bid and ask columns in the result are filled with null<\/li>\n<li>result will have the same shape as the trade table, adding new columns from quote (bid, ask)<\/li>\n<\/ul>\n<h2><strong>Window Join<\/strong><\/h2>\n<p>This joins two tables based on given columns, time intervals and an aggregate function effectively summarising t2s data.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/syntax_wj.png\" alt=\"\" loading=\"lazy\"><br \/>\nThe example below uses time intervals (or \u201cwindows\u201d) of 2 seconds before and after each time in t1. The join then finds all sizes from t2 within each window (w) and averages them.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/wj.png\" alt=\"\" loading=\"lazy\"><\/p>\n<ul>\n<li>for the first window (in blue), it finds 4 sizes in t2 within 11:59:59 and 12:00:03 that have an average of 754.5<\/li>\n<li>this same logic is repeated for the next 2 windows \u2013 (12:00:02-12:00:06 and 12:00:04-12:00:08)<\/li>\n<li>the results are joined on to each row of t1\n<ul>\n<li>you need to provide the same number of windows as there are rows in t1<\/li>\n<\/ul>\n<\/li>\n<li>the last row of t2 is not included in the results as it lies outside of the window<\/li>\n<\/ul>\n<p>As a qbie it took me a moment to grasp the syntax for the window intervals, so hopefully this helps!<\/p>\n<p>Window Join receives the window intervals as two lists. The first containing the list of start times and the second containing the list of end times:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/w.png\" alt=\"\" loading=\"lazy\"><\/p>\n<p>Tip! Use identity function :: in place of an aggregate function if you want all interval values returned.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/06\/idfuncwj.png\" alt=\"\" loading=\"lazy\"><\/p>\n<p>Joins are the bread and butter of much of the high-level work you\u2019ll do with kdb+. I hope through reading this guide you can spend less time learning and more time doing!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I was recently given the opportunity to learn kdb+ and, coming from a Sybase-flavoured SQL background, there were plenty of new concepts to learn. Some I was already familiar with \u2013 especially when it came to joins. The joins I knew and loved so well from SQL were all available in kdb+, so they were [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":7406,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","inline_featured_image":false,"footnotes":""},"categories":[101],"tags":[],"industry":[],"class_list":["post-7405","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"translations":[{"blog_id":1,"post_id":7405,"name":"Europe","code":"EN-GB","hreflang":"en-gb","url":"https:\/\/www.version1.com\/blog\/kdb-joins-for-beginners\/","is_current":false},{"blog_id":13,"post_id":7405,"name":"Americas","code":"EN-US","hreflang":"en-us","url":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/","is_current":true}],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>kdb+: Joins for Beginners | Version 1 (US)<\/title>\n<meta name=\"description\" content=\"In this blog we discuss the study of kdb+ joins with visuals and graphs to give others a better understanding.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"kdb+: Joins for Beginners | Version 1 (US)\" \/>\n<meta property=\"og:description\" content=\"In this blog we discuss the study of kdb+ joins with visuals and graphs to give others a better understanding.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/\" \/>\n<meta property=\"og:site_name\" content=\"Version 1 (US)\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-16T10:30:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.version1.com\/en-us\/wp-content\/uploads\/2019\/02\/man-2562325_1920-1.png.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"680\" \/>\n\t<meta property=\"og:image:height\" content=\"440\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/kdb-joins-for-beginners\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/kdb-joins-for-beginners\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"kdb+: Joins for Beginners\",\"datePublished\":\"2019-02-16T10:30:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/kdb-joins-for-beginners\\\/\"},\"wordCount\":1340,\"publisher\":{\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/kdb-joins-for-beginners\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/wp-content\\\/uploads\\\/2019\\\/02\\\/man-2562325_1920-1.png.webp\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/kdb-joins-for-beginners\\\/\",\"url\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/kdb-joins-for-beginners\\\/\",\"name\":\"kdb+: Joins for Beginners | Version 1 (US)\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/kdb-joins-for-beginners\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/kdb-joins-for-beginners\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/wp-content\\\/uploads\\\/2019\\\/02\\\/man-2562325_1920-1.png.webp\",\"datePublished\":\"2019-02-16T10:30:55+00:00\",\"description\":\"In this blog we discuss the study of kdb+ joins with visuals and graphs to give others a better understanding.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/kdb-joins-for-beginners\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.version1.com\\\/en-us\\\/kdb-joins-for-beginners\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/kdb-joins-for-beginners\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/wp-content\\\/uploads\\\/2019\\\/02\\\/man-2562325_1920-1.png.webp\",\"contentUrl\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/wp-content\\\/uploads\\\/2019\\\/02\\\/man-2562325_1920-1.png.webp\",\"width\":680,\"height\":440,\"caption\":\"Man at laptop with notebook and pen\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/kdb-joins-for-beginners\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"kdb+: Joins for Beginners\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/#website\",\"url\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/\",\"name\":\"Version 1\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/#organization\",\"name\":\"Version 1\",\"url\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.version1.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/cropped-cropped-Favicon-2.png\",\"contentUrl\":\"https:\\\/\\\/www.version1.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/cropped-cropped-Favicon-2.png\",\"width\":512,\"height\":512,\"caption\":\"Version 1\"},\"image\":{\"@id\":\"https:\\\/\\\/www.version1.com\\\/en-us\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"kdb+: Joins for Beginners | Version 1 (US)","description":"In this blog we discuss the study of kdb+ joins with visuals and graphs to give others a better understanding.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/","og_locale":"en_US","og_type":"article","og_title":"kdb+: Joins for Beginners | Version 1 (US)","og_description":"In this blog we discuss the study of kdb+ joins with visuals and graphs to give others a better understanding.","og_url":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/","og_site_name":"Version 1 (US)","article_published_time":"2019-02-16T10:30:55+00:00","og_image":[{"width":680,"height":440,"url":"https:\/\/www.version1.com\/en-us\/wp-content\/uploads\/2019\/02\/man-2562325_1920-1.png.webp","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/#article","isPartOf":{"@id":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/"},"author":{"name":"","@id":""},"headline":"kdb+: Joins for Beginners","datePublished":"2019-02-16T10:30:55+00:00","mainEntityOfPage":{"@id":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/"},"wordCount":1340,"publisher":{"@id":"https:\/\/www.version1.com\/en-us\/#organization"},"image":{"@id":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/#primaryimage"},"thumbnailUrl":"https:\/\/www.version1.com\/en-us\/wp-content\/uploads\/2019\/02\/man-2562325_1920-1.png.webp","articleSection":["Blog"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/","url":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/","name":"kdb+: Joins for Beginners | Version 1 (US)","isPartOf":{"@id":"https:\/\/www.version1.com\/en-us\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/#primaryimage"},"image":{"@id":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/#primaryimage"},"thumbnailUrl":"https:\/\/www.version1.com\/en-us\/wp-content\/uploads\/2019\/02\/man-2562325_1920-1.png.webp","datePublished":"2019-02-16T10:30:55+00:00","description":"In this blog we discuss the study of kdb+ joins with visuals and graphs to give others a better understanding.","breadcrumb":{"@id":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/#primaryimage","url":"https:\/\/www.version1.com\/en-us\/wp-content\/uploads\/2019\/02\/man-2562325_1920-1.png.webp","contentUrl":"https:\/\/www.version1.com\/en-us\/wp-content\/uploads\/2019\/02\/man-2562325_1920-1.png.webp","width":680,"height":440,"caption":"Man at laptop with notebook and pen"},{"@type":"BreadcrumbList","@id":"https:\/\/www.version1.com\/en-us\/kdb-joins-for-beginners\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.version1.com\/en-us\/"},{"@type":"ListItem","position":2,"name":"kdb+: Joins for Beginners"}]},{"@type":"WebSite","@id":"https:\/\/www.version1.com\/en-us\/#website","url":"https:\/\/www.version1.com\/en-us\/","name":"Version 1","description":"","publisher":{"@id":"https:\/\/www.version1.com\/en-us\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.version1.com\/en-us\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.version1.com\/en-us\/#organization","name":"Version 1","url":"https:\/\/www.version1.com\/en-us\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.version1.com\/en-us\/#\/schema\/logo\/image\/","url":"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/05\/cropped-cropped-Favicon-2.png","contentUrl":"https:\/\/www.version1.com\/wp-content\/uploads\/2026\/05\/cropped-cropped-Favicon-2.png","width":512,"height":512,"caption":"Version 1"},"image":{"@id":"https:\/\/www.version1.com\/en-us\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.version1.com\/en-us\/wp-json\/wp\/v2\/posts\/7405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.version1.com\/en-us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.version1.com\/en-us\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.version1.com\/en-us\/wp-json\/wp\/v2\/comments?post=7405"}],"version-history":[{"count":0,"href":"https:\/\/www.version1.com\/en-us\/wp-json\/wp\/v2\/posts\/7405\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.version1.com\/en-us\/wp-json\/wp\/v2\/media\/7406"}],"wp:attachment":[{"href":"https:\/\/www.version1.com\/en-us\/wp-json\/wp\/v2\/media?parent=7405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.version1.com\/en-us\/wp-json\/wp\/v2\/categories?post=7405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.version1.com\/en-us\/wp-json\/wp\/v2\/tags?post=7405"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.version1.com\/en-us\/wp-json\/wp\/v2\/industry?post=7405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}