<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Table Joining in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/373783#M276240</link>
    <description>&lt;P&gt;I'm not sure if it'd make a huge difference but I've always had performance problems with OR's in JOIN conditions and try to avoid them, although I generally do all this in SQL Passthrough, I'm not sure if it makes a difference in straight PROC SQL. &amp;nbsp;You could try something like this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
    create table want as
        select     a.*
                  ,b.key_b
                  ,b.name_b
                  ,(a.name_a=b.name_b) as match_ind
        from       have1 a 
        inner join have2 b 
                on a.zip_a = b.zip_b     
        UNION ALL
        select     a.*
                  ,b.key_b
                  ,b.name_b
                  ,(a.name_a=b.name_b) as match_ind
        from       have1 a 
        inner join have2 b 
                on a.zip2_a = b.zip_b
        order by    key_a, key_b 
;quit;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;I'd also be interested to see alternate approaches to this though, I generally go for a SQL centric solution since that's what I'm most used to, but I love seeing other ways to do things.&lt;/P&gt;</description>
    <pubDate>Thu, 06 Jul 2017 21:43:51 GMT</pubDate>
    <dc:creator>Sven111</dc:creator>
    <dc:date>2017-07-06T21:43:51Z</dc:date>
    <item>
      <title>Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/373756#M276239</link>
      <description>&lt;P&gt;I was wondering if anyone had a better approach for a process I am currently running. What i'm trying to do is join 2 tables together based on Zip, and then do some matching techniques to find the "best" matches from the combined tables.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I have the process working OK now using sql joins, but the run time is very long. I was wondering if any of you had any ideas to optimize this process. I think its important to point out also that i don't want to remove the non-matches (match_ind = 0), I need to keep all records even if it doesnt result in a "match".&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Please let me know if you have any questions or need further explanation of what i'm trying to do. I would be really interested to see if someone has a way to do this with either key indexing or hash tables as I haven't had much experiance with either.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks in advance!&lt;/P&gt;
&lt;P&gt;Tom&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#000080" face="Segoe UI" size="1"&gt;&lt;STRONG&gt;data&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; have1;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;input&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; key_a &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color="#008080" face="Segoe UI" size="1"&gt;2.&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT face="Segoe UI" size="1"&gt; name_a $ &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color="#008080" face="Segoe UI" size="1"&gt;4.&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT face="Segoe UI" size="1"&gt; zip_a $ &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color="#008080" face="Segoe UI" size="1"&gt;6.&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT face="Segoe UI" size="1"&gt; zip2_a $ &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color="#008080" face="Segoe UI" size="1"&gt;6.&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT face="Segoe UI" size="1"&gt;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;datalines&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; ;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;1 aaa 12345&lt;/P&gt;
&lt;P&gt;2 bbb 12345&lt;/P&gt;
&lt;P&gt;3 ccc 55555 12345&lt;/P&gt;
&lt;P&gt;4 ddd 99999&lt;/P&gt;
&lt;P&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#000080" face="Segoe UI" size="1"&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt;; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#000080" face="Segoe UI" size="1"&gt;&lt;STRONG&gt;data&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; have2;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;input&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; key_b &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color="#008080" face="Segoe UI" size="1"&gt;2.&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT face="Segoe UI" size="1"&gt; name_b $ &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color="#008080" face="Segoe UI" size="1"&gt;4.&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT face="Segoe UI" size="1"&gt; zip_b $ &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color="#008080" face="Segoe UI" size="1"&gt;6.&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT face="Segoe UI" size="1"&gt; ;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;datalines&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; ;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;5 aaa 12345&lt;/P&gt;
&lt;P&gt;6 ggg 12345&lt;/P&gt;
&lt;P&gt;7 ccc 12345&lt;/P&gt;
&lt;P&gt;8 ddd 99999&lt;/P&gt;
&lt;P&gt;9 hhh 99999&lt;/P&gt;
&lt;P&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#000080" face="Segoe UI" size="1"&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt;; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#000080" face="Segoe UI" size="1"&gt;&lt;STRONG&gt;proc&lt;/STRONG&gt;&lt;/FONT&gt; &lt;STRONG&gt;&lt;FONT color="#000080" face="Segoe UI" size="1"&gt;sql&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT face="Segoe UI" size="1"&gt;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;create&lt;/FONT&gt; &lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;table&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; want &lt;/FONT&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;as&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;select&lt;/FONT&gt; &lt;FONT color="#008080" face="Segoe UI" size="1"&gt;a.&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt;*&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;, b.key_b&lt;/P&gt;
&lt;P&gt;, b.name_b&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Segoe UI" size="1"&gt;, (a.name_a=b.name_b) &lt;/FONT&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;as&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; match_ind&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;from&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; have1 a &lt;/FONT&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;inner&lt;/FONT&gt; &lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;join&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; have2 b &lt;/FONT&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;on&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; a.zip_a=b.zip_b &lt;/FONT&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;or&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; a.zip2_a=b.zip_b&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;order&lt;/FONT&gt; &lt;FONT color="#0000ff" face="Segoe UI" size="1"&gt;by&lt;/FONT&gt;&lt;FONT face="Segoe UI" size="1"&gt; key_a, key_b&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Segoe UI" size="1"&gt;;&lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color="#000080" face="Segoe UI" size="1"&gt;quit&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT face="Segoe UI" size="1"&gt;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT face="Segoe UI" size="1"&gt;WANT:&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;TABLE width="504" style="width: 378pt; border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0"&gt;&lt;COLGROUP&gt;&lt;COL width="72" style="width: 54pt;" span="7" /&gt;&lt;/COLGROUP&gt;
&lt;TBODY&gt;
&lt;TR style="height: 16.5pt;"&gt;
&lt;TD width="72" height="22" style="border: 0.5pt solid windowtext; border-image: none; width: 54pt; height: 16.5pt; background-color: transparent;"&gt;&lt;STRONG&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;key_a&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="72" style="border-width: 0.5pt 0.5pt 0.5pt 0px; border-style: solid solid solid none; border-color: windowtext windowtext windowtext black; width: 54pt; background-color: transparent;"&gt;&lt;STRONG&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;name_a&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="72" style="border-width: 0.5pt 0.5pt 0.5pt 0px; border-style: solid solid solid none; border-color: windowtext windowtext windowtext black; width: 54pt; background-color: transparent;"&gt;&lt;STRONG&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;zip_a&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="72" style="border-width: 0.5pt 0.5pt 0.5pt 0px; border-style: solid solid solid none; border-color: windowtext windowtext windowtext black; width: 54pt; background-color: transparent;"&gt;&lt;STRONG&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;zip2_a&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="72" style="border-width: 0.5pt 0.5pt 0.5pt 0px; border-style: solid solid solid none; border-color: windowtext windowtext windowtext black; width: 54pt; background-color: transparent;"&gt;&lt;STRONG&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;key_b&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="72" style="border-width: 0.5pt 0.5pt 0.5pt 0px; border-style: solid solid solid none; border-color: windowtext windowtext windowtext black; width: 54pt; background-color: transparent;"&gt;&lt;STRONG&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;name_b&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="72" style="border-width: 0.5pt 0.5pt 0.5pt 0px; border-style: solid solid solid none; border-color: windowtext windowtext windowtext black; width: 54pt; background-color: transparent;"&gt;&lt;STRONG&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;match_ind&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR style="height: 16.5pt;"&gt;
&lt;TD height="22" align="right" style="border-width: 0px 0.5pt 0.5pt; border-style: none solid solid; border-color: black windowtext windowtext; height: 16.5pt; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;1&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;aaa&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;12345&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;5&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;aaa&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;1&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR style="height: 16.5pt;"&gt;
&lt;TD height="22" align="right" style="border-width: 0px 0.5pt 0.5pt; border-style: none solid solid; border-color: black windowtext windowtext; height: 16.5pt; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;1&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;aaa&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;12345&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;6&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;ggg&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;0&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR style="height: 16.5pt;"&gt;
&lt;TD height="22" align="right" style="border-width: 0px 0.5pt 0.5pt; border-style: none solid solid; border-color: black windowtext windowtext; height: 16.5pt; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;1&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;aaa&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;12345&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;7&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;ccc&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;0&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR style="height: 16.5pt;"&gt;
&lt;TD height="22" align="right" style="border-width: 0px 0.5pt 0.5pt; border-style: none solid solid; border-color: black windowtext windowtext; height: 16.5pt; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;2&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;bbb&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;12345&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;5&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;aaa&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;0&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR style="height: 16.5pt;"&gt;
&lt;TD height="22" align="right" style="border-width: 0px 0.5pt 0.5pt; border-style: none solid solid; border-color: black windowtext windowtext; height: 16.5pt; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;2&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;bbb&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;12345&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;6&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;ggg&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;0&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR style="height: 16.5pt;"&gt;
&lt;TD height="22" align="right" style="border-width: 0px 0.5pt 0.5pt; border-style: none solid solid; border-color: black windowtext windowtext; height: 16.5pt; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;2&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;bbb&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;12345&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;7&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;ccc&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;0&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR style="height: 16.5pt;"&gt;
&lt;TD height="22" align="right" style="border-width: 0px 0.5pt 0.5pt; border-style: none solid solid; border-color: black windowtext windowtext; height: 16.5pt; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;3&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;ccc&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;55555&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;12345&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;5&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;aaa&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;0&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR style="height: 16.5pt;"&gt;
&lt;TD height="22" align="right" style="border-width: 0px 0.5pt 0.5pt; border-style: none solid solid; border-color: black windowtext windowtext; height: 16.5pt; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;3&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;ccc&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;55555&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;12345&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;6&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;ggg&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;0&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR style="height: 16.5pt;"&gt;
&lt;TD height="22" align="right" style="border-width: 0px 0.5pt 0.5pt; border-style: none solid solid; border-color: black windowtext windowtext; height: 16.5pt; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;3&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;ccc&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;55555&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;12345&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;7&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;ccc&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;1&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR style="height: 16.5pt;"&gt;
&lt;TD height="22" align="right" style="border-width: 0px 0.5pt 0.5pt; border-style: none solid solid; border-color: black windowtext windowtext; height: 16.5pt; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;4&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;ddd&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;99999&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;8&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;ddd&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;1&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR style="height: 16.5pt;"&gt;
&lt;TD height="22" align="right" style="border-width: 0px 0.5pt 0.5pt; border-style: none solid solid; border-color: black windowtext windowtext; height: 16.5pt; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;4&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;ddd&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;99999&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;9&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;hhh&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align="right" style="border-width: 0px 0.5pt 0.5pt 0px; border-style: none solid solid none; border-color: black windowtext windowtext black; background-color: transparent;"&gt;&lt;FONT color="#000000" face="Segoe UI" size="3"&gt;0&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;</description>
      <pubDate>Thu, 06 Jul 2017 19:46:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/373756#M276239</guid>
      <dc:creator>triley</dc:creator>
      <dc:date>2017-07-06T19:46:07Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/373783#M276240</link>
      <description>&lt;P&gt;I'm not sure if it'd make a huge difference but I've always had performance problems with OR's in JOIN conditions and try to avoid them, although I generally do all this in SQL Passthrough, I'm not sure if it makes a difference in straight PROC SQL. &amp;nbsp;You could try something like this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
    create table want as
        select     a.*
                  ,b.key_b
                  ,b.name_b
                  ,(a.name_a=b.name_b) as match_ind
        from       have1 a 
        inner join have2 b 
                on a.zip_a = b.zip_b     
        UNION ALL
        select     a.*
                  ,b.key_b
                  ,b.name_b
                  ,(a.name_a=b.name_b) as match_ind
        from       have1 a 
        inner join have2 b 
                on a.zip2_a = b.zip_b
        order by    key_a, key_b 
;quit;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;I'd also be interested to see alternate approaches to this though, I generally go for a SQL centric solution since that's what I'm most used to, but I love seeing other ways to do things.&lt;/P&gt;</description>
      <pubDate>Thu, 06 Jul 2017 21:43:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/373783#M276240</guid>
      <dc:creator>Sven111</dc:creator>
      <dc:date>2017-07-06T21:43:51Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/373855#M276241</link>
      <description>I don't have any code suggestions at this point, but some general guidelines.&lt;BR /&gt;- Allow as much memory as possible for the join to minimize swapping (MEMSIZE SORTSIZE)&lt;BR /&gt;- Use the PROC SQL option _method to anlyze how the query plan look like&lt;BR /&gt;- Moving the data to SPDE allows for better I/O and in some cases better WHERE clause evaluation. In this scenario you could try indexing - it &amp;lt;might&amp;gt; work...</description>
      <pubDate>Fri, 07 Jul 2017 08:10:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/373855#M276241</guid>
      <dc:creator>LinusH</dc:creator>
      <dc:date>2017-07-07T08:10:37Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/373902#M276242</link>
      <description>&lt;P&gt;A hash table is twice as fast on my machine.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have1;
input key_a 2. name_a $ 4. zip_a $ 6. zip2_a $ 6.;
do i=1 to 1e3; output; end;
datalines ;
1 aaa 12345
2 bbb 12345
3 ccc 55555 12345
4 ddd 99999
run; 

data have2;
input key_b 2. name_b $ 4. zip_b $ 6. ;
do i=1 to 1e3; output; end;
datalines ;
5 aaa 12345
6 ggg 12345
7 ccc 12345
8 ddd 99999
9 hhh 99999
run;

data WANT2;
  SET HAVE1;
  if _n_=1 then do;
    dcl hash HAVE2(dataset:'HAVE2', multidata: 'Y');
    HAVE2.definekey('ZIP_B');
    HAVE2.definedata('KEY_B','NAME_B');
    HAVE2.definedone();
    if 0 then set HAVE2;
  end;
  RC = HAVE2.find(key:ZIP_A);   
  do while (RC = 0) ;
    output;
    RC=HAVE2.find_next(key:ZIP_A) ;
  end ;
  RC = HAVE2.find(key:ZIP2_A) ;    
  do while (RC = 0) ;
    output;
    RC=HAVE2.find_next(key:ZIP2_A);
  end ;
  drop I RC;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;13250&amp;nbsp; proc sql;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13251&amp;nbsp; create table want as&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13252&amp;nbsp; select a.*&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13253&amp;nbsp; , b.key_b&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13254&amp;nbsp; , b.name_b&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13255&amp;nbsp; , (a.name_a=b.name_b) as match_ind&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13256&amp;nbsp; from have1 a inner join have2 b on a.zip_a=b.zip_b or a.zip2_a=b.zip_b&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13257&amp;nbsp; order by key_a, key_b&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13258&amp;nbsp; ;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;NOTE: The execution of this query involves performing one or more Cartesian product joins that&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; can not be optimized.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;NOTE: SAS threaded sort was used.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;NOTE: Table WORK.WANT created, with 11000000 rows and 8 columns.&lt;/FONT&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13258!&amp;nbsp; quit;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;NOTE: PROCEDURE SQL used (Total process time):&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6.36 seconds&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; user cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9.15 seconds&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; system cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.87 seconds&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; memory&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 265375.66k&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OS Memory&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 338160.00k&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Timestamp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7/07/2017 11:24:42 PM&lt;/FONT&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13270&amp;nbsp; data WANT2;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13271&amp;nbsp;&amp;nbsp;&amp;nbsp; SET HAVE1;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13272&amp;nbsp;&amp;nbsp;&amp;nbsp; if _n_=1 then do;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13273&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dcl hash HAVE2(dataset:'HAVE2', multidata: 'Y');&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13274&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HAVE2.definekey('ZIP_B');&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13275&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HAVE2.definedata('KEY_B','NAME_B');&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13276&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HAVE2.definedone();&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13277&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if 0 then set HAVE2;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13278&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13279&amp;nbsp;&amp;nbsp;&amp;nbsp; RC = HAVE2.find(key:ZIP_A) ;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13280&amp;nbsp;&amp;nbsp;&amp;nbsp; do while (RC = 0) ;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13281&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13282&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RC=HAVE2.find_next(key:ZIP_A) ;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13283&amp;nbsp;&amp;nbsp;&amp;nbsp; end ;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13284&amp;nbsp;&amp;nbsp;&amp;nbsp; RC = HAVE2.find(key:ZIP2_A) ;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13285&amp;nbsp;&amp;nbsp;&amp;nbsp; do while (RC = 0) ;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13286&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13287&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RC=HAVE2.find_next(key:ZIP2_A) ;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13288&amp;nbsp;&amp;nbsp;&amp;nbsp; end ;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13289&amp;nbsp;&amp;nbsp;&amp;nbsp; drop I RC;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;13290&amp;nbsp; run;&lt;/FONT&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;NOTE: There were 5000 observations read from the data set WORK.HAVE2.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;NOTE: There were 4000 observations read from the data set WORK.HAVE1.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;NOTE: The data set WORK.WANT2 has 11000000 observations and 7 variables.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;NOTE: DATA statement used (Total process time):&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.27 seconds&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; user cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.51 seconds&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; system cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.17 seconds&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; memory&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 697.37k&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OS Memory&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 74404.00k&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Timestamp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7/07/2017 11:24:51 PM&lt;/FONT&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 07 Jul 2017 11:32:56 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/373902#M276242</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2017-07-07T11:32:56Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/373937#M276243</link>
      <description>&lt;P&gt;The Hash table took my query from around 20 minutes to around 20 seconds! Looks like I need to start learning how to use Hash tables more now...Thank you very much for providing this info!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;One question though with hash tables, can i still use this to do a comparison of a variable that isn't brought in? So lets say in my example there is also an address for each record, for the matching i need to do i want to compare if the address is the same, do i need to declare that in the "define data" part, or i guess how could i put something equivelant to the sql: &amp;nbsp;a.address=b.address?&lt;/P&gt;</description>
      <pubDate>Fri, 07 Jul 2017 12:24:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/373937#M276243</guid>
      <dc:creator>triley</dc:creator>
      <dc:date>2017-07-07T12:24:46Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374116#M276244</link>
      <description>&lt;P&gt;Just add this line at the bottom of the datastep:&lt;/P&gt;
&lt;P&gt;&lt;FONT size="2" face="courier new,courier"&gt;&lt;FONT color="#000000"&gt;MATCH__IND&lt;/FONT&gt;=(NAME_A=NAME_B);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Many more great performance tips in the book linked from my signature, but not on joins,&lt;/P&gt;
&lt;P&gt;The chapter on table joins will be in the third edition, but it is such a vast topic, with so many variations, and join examples are so space-consuming, that I need a lot more time to organise this chapter into something useful.&lt;/P&gt;</description>
      <pubDate>Fri, 07 Jul 2017 22:48:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374116#M276244</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2017-07-07T22:48:16Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374288#M276245</link>
      <description>What if in the tables the variables are named the same?...my "real" data has both the "names" called name (so instead of name_a=name_b it is  name=name)&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Sun, 09 Jul 2017 16:52:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374288#M276245</guid>
      <dc:creator>triley</dc:creator>
      <dc:date>2017-07-09T16:52:49Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374318#M276246</link>
      <description>Just add a rename dataset option wherever needed. Even in the hash table's data set.&lt;BR /&gt;HAVE2 (rename=(NAME=NAMEB))</description>
      <pubDate>Sun, 09 Jul 2017 20:31:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374318#M276246</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2017-07-09T20:31:45Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374568#M276247</link>
      <description>Chris I really appreciate all the help. I wasn't able to get the MATCH_IND to work though...I tried putting it everywhere in between data; and run; and it didn't get me values for every record. Could you maybe run it out and verify it is working on your end and then provide me with the code you got to work?&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Thanks again...&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Mon, 10 Jul 2017 15:45:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374568#M276247</guid>
      <dc:creator>triley</dc:creator>
      <dc:date>2017-07-10T15:45:39Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374717#M276248</link>
      <description>&lt;P&gt;This works.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
data WANT2;
  SET HAVE1;
  if _n_=1 then do;
    dcl hash HAVE2(dataset:'HAVE2 (rename=(NAME=NAME_B))', multidata: 'Y');
    HAVE2.definekey('ZIP_B');
    HAVE2.definedata('KEY_B','NAME_B');
    HAVE2.definedone();
    if 0 then set HAVE2(rename=(NAME=NAME_B));
  end;
  RC = HAVE2.find(key:ZIP_A);   
  do while (RC = 0) ;
    MATCH_IND=(NAME_A=NAME_B);  
    output;
    RC=HAVE2.find_next(key:ZIP_A) ;
  end ;
  RC = HAVE2.find(key:ZIP2_A) ;    
  do while (RC = 0) ;
    MATCH_IND=(NAME_A=NAME_B);  
    output;
    RC=HAVE2.find_next(key:ZIP2_A);
  end ;
 drop I RC;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Apologies for confusing you. Since there are output statements, the value should be derived before the data is output.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 10 Jul 2017 21:13:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374717#M276248</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2017-07-10T21:13:00Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374720#M276249</link>
      <description>Great, thank you...One more thing and I promise I won't ask anything additional of you...In my real data I have a "zip2_b" as well. I tried just adding it here (HAVE2.definekey('ZIP_B','ZIP2_B'); but it gave me an error. Essentially I want to do the same thing as a join like this:&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;where a.zip_a=b.zip_b&lt;BR /&gt;&lt;BR /&gt;or a.zip_a=b.zip2_b&lt;BR /&gt;&lt;BR /&gt;or a.zip2_a=b.zip_b&lt;BR /&gt;&lt;BR /&gt;or a.zip2_a=b.zip2_b&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Mon, 10 Jul 2017 21:31:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374720#M276249</guid>
      <dc:creator>triley</dc:creator>
      <dc:date>2017-07-10T21:31:39Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374727#M276250</link>
      <description>&lt;P&gt;&lt;SPAN&gt;(HAVE2.definekey('ZIP_B','ZIP2_B'); &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;means you match key 1 AND key 2.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Since you want OR, you need to load 2 hash tables and scan each of them twice, like already do for the first one, so you essentially repeat the existing code twice in that data step.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 10 Jul 2017 22:08:32 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374727#M276250</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2017-07-10T22:08:32Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joining</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374921#M276251</link>
      <description>Makes sense...Thank you!&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Tue, 11 Jul 2017 12:31:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joining/m-p/374921#M276251</guid>
      <dc:creator>triley</dc:creator>
      <dc:date>2017-07-11T12:31:49Z</dc:date>
    </item>
  </channel>
</rss>

