<?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 Table Joins without a Specific Key in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Table-Joins-without-a-Specific-Key/m-p/783001#M249622</link>
    <description>&lt;P&gt;I have two tables: TABLE_A and TABLE_B&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Both tables TABLE_A and TABLE_B are updated daily. I’d like to determine which observations in TABLE_A are “affected” by updates in TABLE_B. This is very specific business requirement. What makes it challenging is that there is &lt;STRONG&gt;&lt;EM&gt;no key&lt;/EM&gt;&lt;/STRONG&gt; that can be used to join the tables directly. The PROC SQL I have takes &lt;STRONG&gt;more than&lt;/STRONG&gt; &lt;STRONG&gt;half hour to complete&lt;/STRONG&gt;. See the code below. Wondering if anyone has a better solution.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Note on the columns. Let’s say TABLE_B has a column called &lt;EM&gt;code_1&lt;/EM&gt;, while TABLE_A has a corresponding column &lt;EM&gt;code_1_list&lt;/EM&gt;. Values in &lt;EM&gt;code_1&lt;/EM&gt; column are alpha-numerical, while &lt;EM&gt;code_1_list&lt;/EM&gt; values are quoted, and comma separated. For example:&lt;/P&gt;&lt;P&gt;TABLE_B&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_1&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;code1_A&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;TABLE_A:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_1_list&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;‘code1_A’, ‘code1_B’, ‘code1_C’&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I need to determine: if *any* observation in TABLE_B is in the list of corresponding column in TABLE_A, I need to include it (or keep/identify it).&lt;/P&gt;&lt;P&gt;By the way, both tables TABLE_A and TABLE_B have 25 of these corresponding columns. Both tables TABLE_A and TABLE_B have ~15k observations on any given day.&lt;/P&gt;&lt;P&gt;Here is a limited example (added notes for clarification):&lt;/P&gt;&lt;P&gt;TABLE_B&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;ID&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_1&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_2&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_3&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_4&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;Note (corresponding to TABLE_A)&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;123&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;FONT color="#339966"&gt;code1_A&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;FONT color="#0000FF"&gt;code2_B&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code3_W&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code4_D&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;In ID: A1, code_1_list and&lt;/P&gt;&lt;P&gt;A3, code_2_list&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;124&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code1_E&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;FONT color="#0000FF"&gt;code2_B&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code3_P&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code4_R&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;In ID: A3, code_2_list&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;125&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code1_H&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code2_J&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code3_K&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code4_E&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;126&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;FONT color="#339966"&gt;code1_A&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code2_P&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code3_A&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code4_K&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;In ID: A1, code_1_list&lt;BR /&gt;also ID: A3 code_2_list&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;TABLE_A&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;ID&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_1_list&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_2_list&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_3_list&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_4_list&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;note&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;A1&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'&lt;FONT color="#339966"&gt;code1_A&lt;/FONT&gt;', 'code1_C'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code2_A', 'code2_K', 'code2_G'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code3_F'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code4_A', 'code4_L'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;keep: ID 123, code_1 in TABLE_B&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;A2&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code1_B', 'code1_C', 'code1_J'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code2_A', 'code2_G'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code3_L'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code4_I', 'code4_R'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;A3&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'&lt;FONT color="#339966"&gt;code1_A&lt;/FONT&gt;'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'&lt;FONT color="#0000FF"&gt;code2_B&lt;/FONT&gt;', 'code2_P'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code3_F'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code4_A', 'code4_M'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;keep: ID 123, code_1 and&lt;BR /&gt;ID 123 &amp;amp; 124, code_2&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;From the example above, only observations A1 and A3 are kept in TABLE_A.&lt;/P&gt;&lt;P&gt;Your thoughts? It seems there might be a much simpler solution that is escaping me...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;SQL:&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;proc sql;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; create table&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; work.table_ab as&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select distinct&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A.*&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; work.TABLE_A A,&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; work.TABLE_B B&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; A.code_1_list like (cats("'%",B.code_1,"%'"))&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; or&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; A.code_2_list like (cats("'%",B.code_2,"%'"))&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; or&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; A.code_3_list like (cats("'%",B.code_3,"%'"))&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; or&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; A.code_4_list like (cats("'%",B.code_4,"%'"))&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&lt;STRONG&gt;quit&lt;/STRONG&gt;;&lt;/FONT&gt;&lt;/P&gt;</description>
    <pubDate>Mon, 29 Nov 2021 20:56:51 GMT</pubDate>
    <dc:creator>DipuRahman</dc:creator>
    <dc:date>2021-11-29T20:56:51Z</dc:date>
    <item>
      <title>Table Joins without a Specific Key</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joins-without-a-Specific-Key/m-p/783001#M249622</link>
      <description>&lt;P&gt;I have two tables: TABLE_A and TABLE_B&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Both tables TABLE_A and TABLE_B are updated daily. I’d like to determine which observations in TABLE_A are “affected” by updates in TABLE_B. This is very specific business requirement. What makes it challenging is that there is &lt;STRONG&gt;&lt;EM&gt;no key&lt;/EM&gt;&lt;/STRONG&gt; that can be used to join the tables directly. The PROC SQL I have takes &lt;STRONG&gt;more than&lt;/STRONG&gt; &lt;STRONG&gt;half hour to complete&lt;/STRONG&gt;. See the code below. Wondering if anyone has a better solution.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Note on the columns. Let’s say TABLE_B has a column called &lt;EM&gt;code_1&lt;/EM&gt;, while TABLE_A has a corresponding column &lt;EM&gt;code_1_list&lt;/EM&gt;. Values in &lt;EM&gt;code_1&lt;/EM&gt; column are alpha-numerical, while &lt;EM&gt;code_1_list&lt;/EM&gt; values are quoted, and comma separated. For example:&lt;/P&gt;&lt;P&gt;TABLE_B&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_1&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;code1_A&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;TABLE_A:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_1_list&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;‘code1_A’, ‘code1_B’, ‘code1_C’&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I need to determine: if *any* observation in TABLE_B is in the list of corresponding column in TABLE_A, I need to include it (or keep/identify it).&lt;/P&gt;&lt;P&gt;By the way, both tables TABLE_A and TABLE_B have 25 of these corresponding columns. Both tables TABLE_A and TABLE_B have ~15k observations on any given day.&lt;/P&gt;&lt;P&gt;Here is a limited example (added notes for clarification):&lt;/P&gt;&lt;P&gt;TABLE_B&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;ID&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_1&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_2&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_3&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_4&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;Note (corresponding to TABLE_A)&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;123&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;FONT color="#339966"&gt;code1_A&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;FONT color="#0000FF"&gt;code2_B&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code3_W&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code4_D&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;In ID: A1, code_1_list and&lt;/P&gt;&lt;P&gt;A3, code_2_list&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;124&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code1_E&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;FONT color="#0000FF"&gt;code2_B&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code3_P&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code4_R&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;In ID: A3, code_2_list&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;125&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code1_H&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code2_J&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code3_K&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code4_E&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;126&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;FONT color="#339966"&gt;code1_A&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code2_P&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code3_A&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;code4_K&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;In ID: A1, code_1_list&lt;BR /&gt;also ID: A3 code_2_list&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;TABLE_A&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;ID&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_1_list&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_2_list&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_3_list&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;code_4_list&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;note&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;A1&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'&lt;FONT color="#339966"&gt;code1_A&lt;/FONT&gt;', 'code1_C'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code2_A', 'code2_K', 'code2_G'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code3_F'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code4_A', 'code4_L'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;keep: ID 123, code_1 in TABLE_B&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;A2&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code1_B', 'code1_C', 'code1_J'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code2_A', 'code2_G'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code3_L'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code4_I', 'code4_R'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;A3&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'&lt;FONT color="#339966"&gt;code1_A&lt;/FONT&gt;'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'&lt;FONT color="#0000FF"&gt;code2_B&lt;/FONT&gt;', 'code2_P'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code3_F'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;'code4_A', 'code4_M'&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;keep: ID 123, code_1 and&lt;BR /&gt;ID 123 &amp;amp; 124, code_2&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;From the example above, only observations A1 and A3 are kept in TABLE_A.&lt;/P&gt;&lt;P&gt;Your thoughts? It seems there might be a much simpler solution that is escaping me...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;SQL:&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;proc sql;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; create table&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; work.table_ab as&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select distinct&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A.*&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; work.TABLE_A A,&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; work.TABLE_B B&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; A.code_1_list like (cats("'%",B.code_1,"%'"))&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; or&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; A.code_2_list like (cats("'%",B.code_2,"%'"))&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; or&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; A.code_3_list like (cats("'%",B.code_3,"%'"))&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; or&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&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;&amp;nbsp;&amp;nbsp; A.code_4_list like (cats("'%",B.code_4,"%'"))&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&lt;STRONG&gt;quit&lt;/STRONG&gt;;&lt;/FONT&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 29 Nov 2021 20:56:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joins-without-a-Specific-Key/m-p/783001#M249622</guid>
      <dc:creator>DipuRahman</dc:creator>
      <dc:date>2021-11-29T20:56:51Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joins without a Specific Key</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joins-without-a-Specific-Key/m-p/783074#M249646</link>
      <description>&lt;P&gt;This could be faster:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;where index(A.code_1_list ,B.code_1)
   or index(A.code_2_list ,B.code_2)
   or index(A.code_3_list ,B.code_3)
   or index(A.code_4_list ,B.code_4)&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;You might need to trim B values if the field is too long for its value&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 30 Nov 2021 21:13:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joins-without-a-Specific-Key/m-p/783074#M249646</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2021-11-30T21:13:48Z</dc:date>
    </item>
    <item>
      <title>Re: Table Joins without a Specific Key</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Table-Joins-without-a-Specific-Key/m-p/783118#M249672</link>
      <description>&lt;P&gt;A data step solution using keyed lookup may be faster.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If your data looks something like this:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data b;                                                            
  input id (code_1-code_4) ($);                                    
cards;                                                             
123 code1_A code2_B code3_W code4_D                                
124 code1_E code2_B code3_P code4_R                                
125 code1_H code2_J code3_K code4_E                                
126 code1_A code2_P code3_A code4_K                                
;run;                                                              
data a;                                                            
  infile cards dsd delimiter=';' truncover;                        
  length ID $2 code_1_list code_2_list code_3_list $20;            
  input ID--code_3_list;                                           
cards4;                                                            
A1;'code1_A', 'code1_C';'code2_A', 'code2_K', 'code2_G';'code3_F'  
A2;'code1_B', 'code1_C', 'code1_J';code2_A', 'code2_G';'code3_L'   
A3;'code1_A';'code2_B', 'code2_P';'code3_F';                       
;;;;run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;You first transpose and index the codes in B:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data codes(index=(idx=(num code)) keep=num code);
  set b;                                         
  array codes(*) code_:;                         
  do num=1 to dim(codes);                        
    code=codes(num);                             
    output;                                      
    end;&lt;BR /&gt;&lt;BR /&gt;run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Then you use keyed lookup to check the A dataset:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;                             
  set a;                               
  array lists(*) code_:;               
  do num=1 to dim(lists);              
    do _N_=1 to countw(lists(num));    
      code=scan(lists(num),_N_,"', "); 
      set codes key=idx/unique;        
      if not _iorc_ then do;           
        output;                        
        _error_=0;                     
        delete;                        
        end;                           
      end;                             
    end;                               
  _error_=0;                           
  drop num code;                       
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The "_error_=0" statement comes in because whenever a code is not found, it generates an "error". Which you probably do not want to see in the log.&lt;/P&gt;</description>
      <pubDate>Tue, 30 Nov 2021 12:53:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Table-Joins-without-a-Specific-Key/m-p/783118#M249672</guid>
      <dc:creator>s_lassen</dc:creator>
      <dc:date>2021-11-30T12:53:19Z</dc:date>
    </item>
  </channel>
</rss>

