<?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 proc sql ignoring and statement in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/proc-sql-ignoring-and-statement/m-p/911723#M359505</link>
    <description>&lt;P&gt;I am trying to merge data from one data set to another based on first and last name. I run the following code:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;proc sql;
	create table merged_data as
	select *
	from pull_data
	where strip(upcase(last_name)) in (select strip(upcase(NameLast)) from reference_data)
		and strip(upcase(first_name)) in (select strip(upcase(NameFirst)) from reference_data);
quit;&lt;/PRE&gt;
&lt;P&gt;This matches all last names without regard to first name. So in the example data below, fake_l_name_1 will match with fake_f_name_1 and fake_f_name_2, rather than with fake_f_name_1 only. Can anyone tell me why proc sql is ignoring the 'and' statement?&lt;/P&gt;
&lt;PRE&gt;data pull_data;
input userID $4. first_name $14. last_name $14. ;
datalines;
1693 fake_f_name_1 fake_l_name_1
1693 fake_f_name_1 fake_l_name_1
1693 fake_f_name_1 fake_l_name_1
1693 fake_f_name_1 fake_l_name_1
1693 fake_f_name_1 fake_l_name_1
1693 fake_f_name_1 fake_l_name_1
1129 fake_f_name_2 fake_l_name_1
1129 fake_f_name_2 fake_l_name_1
1129 fake_f_name_2 fake_l_name_1
1129 fake_f_name_2 fake_l_name_1
1129 fake_f_name_2 fake_l_name_1
1129 fake_f_name_2 fake_l_name_1
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1492 fake_f_name_4 fake_l_name_2
1492 fake_f_name_4 fake_l_name_2
1492 fake_f_name_4 fake_l_name_2
1492 fake_f_name_4 fake_l_name_2
;

data reference_data;
input NameFirst $14. NameLast $14. ;
datalines;
fake_f_name_1	fake_l_name_1
fake_f_name_2	fake_l_name_2
fake_f_name_3	fake_l_name_3
fake_f_name_4	fake_l_name_4
fake_f_name_5	fake_l_name_5
fake_f_name_6	fake_l_name_6
fake_f_name_7	fake_l_name_7
fake_f_name_8	fake_l_name_8
;&lt;/PRE&gt;</description>
    <pubDate>Wed, 17 Jan 2024 01:17:51 GMT</pubDate>
    <dc:creator>axescot78</dc:creator>
    <dc:date>2024-01-17T01:17:51Z</dc:date>
    <item>
      <title>proc sql ignoring and statement</title>
      <link>https://communities.sas.com/t5/SAS-Programming/proc-sql-ignoring-and-statement/m-p/911723#M359505</link>
      <description>&lt;P&gt;I am trying to merge data from one data set to another based on first and last name. I run the following code:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;proc sql;
	create table merged_data as
	select *
	from pull_data
	where strip(upcase(last_name)) in (select strip(upcase(NameLast)) from reference_data)
		and strip(upcase(first_name)) in (select strip(upcase(NameFirst)) from reference_data);
quit;&lt;/PRE&gt;
&lt;P&gt;This matches all last names without regard to first name. So in the example data below, fake_l_name_1 will match with fake_f_name_1 and fake_f_name_2, rather than with fake_f_name_1 only. Can anyone tell me why proc sql is ignoring the 'and' statement?&lt;/P&gt;
&lt;PRE&gt;data pull_data;
input userID $4. first_name $14. last_name $14. ;
datalines;
1693 fake_f_name_1 fake_l_name_1
1693 fake_f_name_1 fake_l_name_1
1693 fake_f_name_1 fake_l_name_1
1693 fake_f_name_1 fake_l_name_1
1693 fake_f_name_1 fake_l_name_1
1693 fake_f_name_1 fake_l_name_1
1129 fake_f_name_2 fake_l_name_1
1129 fake_f_name_2 fake_l_name_1
1129 fake_f_name_2 fake_l_name_1
1129 fake_f_name_2 fake_l_name_1
1129 fake_f_name_2 fake_l_name_1
1129 fake_f_name_2 fake_l_name_1
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1345 fake_f_name_3 fake_l_name_2
1492 fake_f_name_4 fake_l_name_2
1492 fake_f_name_4 fake_l_name_2
1492 fake_f_name_4 fake_l_name_2
1492 fake_f_name_4 fake_l_name_2
;

data reference_data;
input NameFirst $14. NameLast $14. ;
datalines;
fake_f_name_1	fake_l_name_1
fake_f_name_2	fake_l_name_2
fake_f_name_3	fake_l_name_3
fake_f_name_4	fake_l_name_4
fake_f_name_5	fake_l_name_5
fake_f_name_6	fake_l_name_6
fake_f_name_7	fake_l_name_7
fake_f_name_8	fake_l_name_8
;&lt;/PRE&gt;</description>
      <pubDate>Wed, 17 Jan 2024 01:17:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/proc-sql-ignoring-and-statement/m-p/911723#M359505</guid>
      <dc:creator>axescot78</dc:creator>
      <dc:date>2024-01-17T01:17:51Z</dc:date>
    </item>
    <item>
      <title>Re: proc sql ignoring and statement</title>
      <link>https://communities.sas.com/t5/SAS-Programming/proc-sql-ignoring-and-statement/m-p/911724#M359506</link>
      <description>&lt;P&gt;Thank you for providing sample data via working SAS code.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I assume what you're trying to achieve is an inner join. Code like below should do.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
	create table merged_data as
	select a.*
	from pull_data a inner join reference_data b
    on strip(upcase(a.last_name))=strip(upcase(b.NameLast)) 
      and strip(upcase(a.first_name))=strip(upcase(b.NameFirst))
  ;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The filter condition you defined does independent lookups in table reference_data meaning the condition gets true if the first and last name in your base table exist anywhere in the lookup table reference_data - it doesn't need to be on the same row.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 17 Jan 2024 01:38:32 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/proc-sql-ignoring-and-statement/m-p/911724#M359506</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2024-01-17T01:38:32Z</dc:date>
    </item>
  </channel>
</rss>

