Question

IBM DB2 Left Outer Join query, it does not work...

Asked by: chris_rutherford

Hello,

I've two tables, one called westpac_data and the other called pol_policy.  The linking field between those two tables is cardnbr on the westpac_data table and plc_bill_acctnum on the pol_policy table.  I want all the records from westpac_data and whatever matches on the pol_policy table.  When I run the following query it acts like an equal join, it only gives me data from both tables where those two fields match.

There are 38442 records on westpac_data and 406000 records on pol_policy, the query below only returns 22622 records, i.e. only the matching records.  Does anyone know why this does not work???

select count(*)
from admin.westpac_data wp left outer join admin.pol_policy s6 on wp.cardnbr = s6.plc_bill_acctnum

I don't think this question is difficult, I'm just not doing something right.

Cheers,

Chris

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2003-05-12 at 21:51:00ID20614322
Tags

db2

,

join

,

outer

,

left

Topic

DB2 Database

Participating Experts
6
Points
500
Comments
21

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. DB2 Outer Join
    Does anyone know that if DB2 supports outer join syntax other than the ANSI standard ("LEFT OUTER JOIN tableX ON ")? like the one in MSSQL(" *= ") or the one in ORACLE (" =(+) "). or it ONLY supports ANSI standard outer join?
  2. what is left outer join ?
    what is left outer join ?
  3. OUTER JOINS
    I'm trying to run the query shown below. I'd like to do a full outer join instead of a left or right outer join. How can I accomplish this? The documentation I've found indicates that there is only a left and right outer join to choose from but I need all of the records fr...
  4. OUTER JOIN
    Hello: Query 1= select last_name, department_name from employees e, departments d where e.department_id = d.department_id(+) and department_name = 'HR'; Query 2 = select last_name, department_name from employees e left outer join departments d on ...
  5. Inner and Outer joins
    Hi, My weakest skill in SYBASE is probably joins. I'm well able to use equi joins but always struggle with inner and outer joins. When I need them I research them and inevitably have forgotten which does what etc by the time I need it again! Can anyone explain how they work...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: yongsingPosted on 2003-05-13 at 03:03:28ID: 8515355

The result is unexpected. Are you sure about the number of rows in each table?

 

by: LowfatspreadPosted on 2003-05-13 at 03:27:15ID: 8515461

I'm a bit rusty is it something to do with nulls?

have you tried

count(wp.cardnbr)

..


btw
i usually specify my on condition in the
same context as the join...

left
wp.cardnbr = pol_policy


hth

 

by: shirrasPosted on 2003-05-13 at 06:41:43ID: 8516675

select count(*) from admin.westpac_data wp left outer join admin.pol_policy s6 on wp.cardnbr = s6.plc_bill_acctnum

weird...I created tables to test this as follows...
test(acct int)
test2(acct2 int,data char(1))

then inserted the following data into test...
1,2,3,4
then inserted into test2...
1,'y'
3,'y'
7,'y'

then ran the following...
select count(*) from test1 a left outer join test2 b on a.acct=b.acct2

and it returned
1
-----------
          4
  1 record(s) selected.
as expected.
so there is nothing wrong with your sql that's for certain...what db2 version and fixpack level are you at?  there has been some problems with certain joins at different fixpack levels (mostly hybrid joins though).

 

by: chris_rutherfordPosted on 2003-05-13 at 14:38:24ID: 8520738

Hello,

Thanks all for your replies.  Very much appreciated.

1.  I've checked and re-checked the total number of records on each table.  There are 38,442 records on the westpac_data table and a litte over 406,000 on the pol_policy table.

2.  We are using IBM DB2 7 fix pack 5.  

If this helps anyone that could assist then that would be perfect.  I've put on some more points as this seems a little more complicated than I first thought.

Thanks again,

Chris

 

by: yongsingPosted on 2003-05-14 at 03:07:04ID: 8523356

I use DB2 v7 fix pack 5, and I've no problems with left outer joins.

 

by: shirrasPosted on 2003-05-14 at 08:22:56ID: 8524962

yongsing, since you are on fixpack 5 could you create two tables like I did and test the sql on fixpack 5?  I'm running fp6 and had no problems.  I just wondering if the sql is hitting some weird bug in the optimizer that was fixed in fixpack 6.  I know from experience that neither fixpack 4 or 5 are really that stable and had some serious issues.
Thanks

 

by: yongsingPosted on 2003-05-14 at 08:38:06ID: 8525121

I've done left outer joins quite a few times in my work, and I certainly have no problem. In fact, just to be really sure, I specifically tested it on two existing tables of mine, and the results are what I would expect.

 

by: shirrasPosted on 2003-05-14 at 08:45:43ID: 8525191

These are the four records I get back from the above scenario I set up and the data matches perfectly with whats expected.
ACCT        DATA
----------- ----
          1 y
          2 -
          3 y
          4 -

  4 record(s) selected.

Is there anything special about these two tables?  could you provide us with the ddl for them...thanks.

 

by: jcelkoPosted on 2003-05-14 at 09:19:20ID: 8525502

>> I've two tables, one called westpac_data and the other called pol_policy.  The linking field [sic] between those two tables is cardnbr on the westpac_data table and plc_bill_acctnum on the pol_policy table. <<

This is SQL and not IMS, isn't it?  Tables have rows and columns, which are totally different from the records and fields found in file systems.  

>>  I want all the records [sic] from westpac_data and whatever matches on the pol_policy table.  <<

Where is the DDL for these tables?  I suppose we can just guess at the keys, DRI, datatypes, constraints and everything else.  

SELECT * -- change to real column names!!
  FROM Westpac_data AS wp,
       Pol_policy AS S6
 WHERE WP.cardnbr = S6.plc_bill_acctnum;

If you want all the data, why are you asking for the cardinality of the outer join, which has to be at least equal to cardinality of the preserved table (Westpac_data)?  YOur spec and your only sample do not match.  

Are WP.cardnbr and S6.plc_bill_acctnum synomyms for the same data element?  If so, why do you have two names for the same data element?  Are they keys?  

Here is how OUTER JOINs work in SQL-92.  Assume you are given:

Table1       Table2
 a   b        a   c
 ======       ======
 1   w        1   r
 2   x        2   s
 3   y        3   t
 4   z

and the outer join expression:

 Table1
 LEFT OUTER JOIN
 Table2
 ON Table1.a = Table2.a      <== join condition
    AND Table2.c = 't';      <== single table condition

We call Table1 the "preserved table" and Table2 the "unpreserved table" in the query.  What I am going to give you is a little different, but equivalent to the ANSI/ISO standards.

1)  We build the CROSS JOIN of the two tables.  Scan each row in the result set.  

2) If the predicate tests TRUE for that row, then you keep it. You also remove all rows derived from it from the CROSS JOIN

3) If the predicate tests FALSE or UNKNOWN for that row, then keep the columns from the preserved table, convert all the columns from the unpreserved table to NULLs and remove the duplicates.

So let us execute this by hand:

 Let @ = passed the first predicate
 Let * = passed the second predicate

 Table1 CROSS JOIN Table2
 a   b        a   c
 =========================
 1   w       1   r @
 1   w       2   s
 1   w       3   t *
 2   x       1   r
 2   x       2   s @
 2   x       3   t *
 3   y       1   r
 3   y       2   s
 3   y       3   t @* <== the TRUE set
 4   z       1   r
 4   z       2   s
 4   z       3   t *

 Table1 LEFT OUTER JOIN Table2
 a   b        a   c
 =========================
 3   y     3      t      <= only TRUE row
 -----------------------
 1   w     NULL   NULL   Sets of duplicates
 1   w     NULL   NULL
 1   w     NULL   NULL
 -----------------------
 2   x     NULL   NULL
 2   x     NULL   NULL
 2   x     NULL   NULL
 3   y     NULL   NULL  <== derived from the TRUE set - Remove  
 3   y     NULL   NULL
 -----------------------
 4   z     NULL   NULL
 4   z     NULL   NULL
 4   z     NULL   NULL

the final results:

 Table1 LEFT OUTER JOIN Table2
 a   b        a   c
 =========================
 1   w     NULL   NULL
 2   x     NULL   NULL
 3   y     3      t
 4   z     NULL   NULL

The basic rule is that every row in the preserved table is represented in the results in at least one result row.

There are limitations and very serious problems with the extended equality version of an outer join used in some diseased mutant products.  Consider the two Chris Date tables

 Suppliers        SupParts
 supno             supno partno qty
 =========        ==============
 S1               S1   P1    100
 S2               S1   P2    250
 S3               S2   P1    100
                  S2   P2    250

and let's do an extended equality outer join like this:

 SELECT *
  FROM Supplier, SupParts
 WHERE Supplier.supno *= SupParts.supno
   AND qty < 200;

If I do the outer first, I get:

 Suppliers LOJ SupParts
 supno supno partno qty
 =======================
 S1     S1   P1    100
 S1     S1   P2    250
 S2     S2   P1    100
 S2     S2   P2    250
 S3   NULL  NULL   NULL

Then I apply the (qty < 200) predicate and get

 Suppliers LOJ SupParts
 supno supno partno qty
 ===================
 S1   S1   P1    100
 S2   S2   P1    100

Doing it in the opposite order

 Suppliers LOJ SupParts
 supno supno partno qty
 ===================
 S1   S1   P1    100
 S2   S2   P1    100
 S3   NULL NULL  NULL

Sybase does it one way, Oracle does it the other and Centura (nee Gupta) lets you pick which one -- the worst of both non-standard worlds!  In SQL-92, you have a choice and can force the order of execution. Either do the predicates after the join ...

 SELECT *
   FROM Supplier
        LEFT OUTER JOIN
        SupParts
        ON Supplier.supno = SupParts.supno
 WHERE qty < 200;

 ... or do it in the joining:

 SELECT *
  FROM Supplier
       LEFT OUTER JOIN
       SupParts
       ON Supplier.supno = SupParts.supno
          AND qty < 200;

Another problem is that you cannot show the same table as preserved and unpreserved in the extended equality version, but it is easy in SQL-92.  For example to find the students who have taken Math 101 and might have taken Math 102:

 SELECT C1.student, C1.math, C2.math
  FROM (SELECT * FROM Courses WHERE math = 101) AS C1
       LEFT OUTER JOIN
       (SELECT * FROM Courses WHERE math = 102) AS C2
       ON C1.student = C2.student;

 

by: BigSchmuhPosted on 2003-05-14 at 11:03:39ID: 8526346

2 more ideas:
1/ db2set parameters
Can you although provide us with the "DB2SET -all" results as you may have some specific join type disabled ?
==> I bet your shirt on this one ;-)

2/ Different datatype for the joined fields ?
Does westpac_data.cardnbr and pol_policy table.plc_bill_acctnum use exactly the same datatype or is there any difference between them ?


And thanks to jcelko for giving us his next unusefull "The Theory lesson" using an URL instead of a 5 pages text :-(

 

by: chris_rutherfordPosted on 2003-05-14 at 14:24:55ID: 8527767

Hello,

I do appreciate your efforts on this for me.  I've got the DDL and the DB2SET -all (interesting your willing to bet my shirt on that :) results.

The DB2SET -all...

C:\>db2set -all
[e] DB2PATH=C:\Program Files\SQLLIB
[i] DB2SATELLITEID=admin
[i] DB2NBADAPTERS=1
[i] DB2INSTPROF=C:\PROGRAM FILES\SQLLIB
[i] DB2COMM=NETBIOS,TCPIP,NPIPE
[g] DB2SYSTEM=WLIDB201
[g] DB2PATH=C:\Program Files\SQLLIB
[g] DB2INSTDEF=DB2
[g] DB2COMM=NETBIOS,TCPIP,NPIPE
[g] DB2ADMINSERVER=DB2DAS00

C:\>

The DDL for POL_POLICY...

------------------------------------------------
-- DDL Statements for table "ADMIN   "."POL_POLICY"
------------------------------------------------
 
 CREATE TABLE "ADMIN   "."POL_POLICY"  (
            "PLC_START" SMALLINT NOT NULL ,
            "PLC_END" SMALLINT NOT NULL ,
            "PLC_POLICY" CHAR(15) NOT NULL ,
            "PLC_BILL_METHOD" CHAR(2) ,
            "PLC_BILL_FREQ" CHAR(2) ,
            "PLC_BILL_ACCTNUM" CHAR(20) ,
            "PLC_CCEXPDATE" CHAR(5) ,
            "PLC_BANKCODE" CHAR(10) NOT NULL ,
            "PLC_BRANCHCD" CHAR(10) NOT NULL ,
            "PLC_CREDIT_CARD" CHAR(2) NOT NULL ,
            "PLC_TAX_JURIS" CHAR(2) NOT NULL WITH DEFAULT '',
            "PLC_REF1" VARCHAR(100) ,
            "PLC_REF2" VARCHAR(100) ,
            "PLC_REF3" VARCHAR(100) ,
            "PLC_BILLNAME" CHAR(50) NOT NULL WITH DEFAULT '',
            "PLC_PRESENT_CUR" CHAR(2) NOT NULL WITH DEFAULT ' ',
            "PLC_BILL_CUR" CHAR(2) NOT NULL WITH DEFAULT ' ',
            "PLC_ACCT_DEBIT_DT" DATE )  
           IN "USERSPACE1" ;
 ALTER TABLE "ADMIN   "."POL_POLICY" PCTFREE 0;

-- DDL Statements for indexes on Table "ADMIN   "."POL_POLICY"

CREATE INDEX "ADMIN   "."PLC_ACCOUNTNUM" ON "ADMIN   "."POL_POLICY"
          ("PLC_BILL_ACCTNUM" ASC);


-- DDL Statements for primary key on Table "ADMIN   "."POL_POLICY"

ALTER TABLE "ADMIN   "."POL_POLICY"
     ADD PRIMARY KEY
          ("PLC_POLICY",
           "PLC_START");

And finally the DDL for the Westpac_Data table...

------------------------------------------------
-- DDL Statements for table "ADMIN   "."WESTPAC_DATA"
------------------------------------------------
 
 CREATE TABLE "ADMIN   "."WESTPAC_DATA"  (
            "ID" INTEGER NOT NULL ,
            "ORG" INTEGER ,
            "ACCTNBR" CHAR(20) ,
            "CARDNBR" CHAR(30) ,
            "CUSTNBR" CHAR(30) ,
            "BLOCK1" CHAR(50) ,
            "BLOCK2" CHAR(50) ,
            "OPENDATE" DATE ,
            "INS1CDE" CHAR(50) ,
            "MAILNAME" CHAR(50) ,
            "SALUTAT" CHAR(50) ,
            "DOB" DATE ,
            "ADDR1" CHAR(50) ,
            "ADDR2" CHAR(50) ,
            "ADDR3" CHAR(50) ,
            "POSTCDE" CHAR(50) ,
            "HOMEPHON" CHAR(50) )  
           IN "USERSPACE1" ;

I hope this assists in solving this most troublesome issue.  I've upped the points to 500, thanks again for all your suggestions.

Chris

 

by: shirrasPosted on 2003-05-15 at 05:40:51ID: 8532609

ok, think I may see where your problem lies....you are allowing the account number to be null on both tables and it is not guaranteed to be unique.  so if you select count(*) from admin.pol_policy where PLC_BILL_ACCTNUM is null you will find your remaining rows.  basically with no uniqueness ensured you will get one row back for all rows that contain a null account number in plc_bill_acctnum.  You should redefine this table as not null and look into defining it as a primary key or creating a unique index on it.

 

by: shirrasPosted on 2003-05-15 at 05:47:29ID: 8532641

never mind...I take that last one back. at least as far as the nulls dorking up the count returned.  however, the query won't produce truly accurate results as long as you are allowing nulls in the account number columns (since theoretically, and from my testing, you could have multiple null values for account number in the first table and multiple null values in the second...which one matches the other???)

 

by: BigSchmuhPosted on 2003-05-15 at 06:37:22ID: 8533035

Sorry about that Shirras but Null values NEVER joins as they never matchs ("NULL = NULL" is NULL means neither FALSE nor TRUE)
==> I still do not see any non-BUG related reason for your simple count query not to retrieve your 38442 rows (and I loose a shirt)

You can although try to modify your columns datatype (or cast your query) to be exactly the same as it is not very normal to join using different column datatype (even if it is totally possible "theorically")
   westpac_data.cardnbr is a char(30) (Make it 20)
   pol_policy table.plc_bill_acctnum is a char(20) (Or make this one 30)

 

by: shirrasPosted on 2003-05-15 at 06:58:08ID: 8533218

I agree BigSchmuh....but multiple null values in the policy table should all return the first null value row from westpac (which is probably not a good thing), but 38422 rows should still be returned.  I've tried using char of different lengths and the same lengths on the join and both worked, even so 38422 rows should still be returned even if spaces are filled in different places.  Haven't been able to find a specific apar in fixpack 5 or higher dealing with an issue like this yet.  but I'll keep digging.

 

by: LowfatspreadPosted on 2003-05-15 at 07:11:19ID: 8533318

no NULL does not equal NULL
so you never match Table1 to Table2

and because your join condition is itself Null i think it
gets excluded....

you'll need to check Codd & Date, and go into relational/set theory to see why

try

select count(*)
 from
(select case when cardnbr is null then 0 else 1 end as joinid
  , cardnbr from admin.westpac_data a ) as wp
 left outer join
(select 1 as joinid , plc_bill_acctnum from table b
  where plc_bill_acctnum is not null) as s6
 on a.joinid = b.joinid
 where wp.cardnbr=s6.plc_bill_acctnum
   or wp.cardnbr is null
 
hth

 

by: shirrasPosted on 2003-05-15 at 07:23:12ID: 8533410

you are correct...you will get the null values from the first table and nulls returned for the values (or what should be the values) of the second making every null account number in pol_policy appear (and the count should come out correctly) but all columns selected from westpac will have null values for these null pol_policy account number rows.  Hopefully that clarifies the point that I was trying to say...

 

by: BigSchmuhPosted on 2003-05-15 at 08:09:29ID: 8533821

Chris: can you just add a condition in your left join for us to get rid of this specific NULL case:
 select count(*)
 from admin.westpac_data wp
   left outer join admin.pol_policy s6
      on wp.cardnbr = s6.plc_bill_acctnum
         AND s6.plc_bill_acctnum IS NOT NULL

==> This is my final post on your question as if you still do NOT have your 38442 rows, I will conclude "That is definitely a BUG. Please open a case at IBM support and ask for an APAR number (The BUG #reference you got when IBM can reproduce it) and its first FixPak".

 

by: chris_rutherfordPosted on 2003-05-15 at 14:19:22ID: 8536632

Hello,

Well that last select statement worked perfectly.  In all fairness I would like to distribute the points as it was more of a team effort but this site will not allow me to do so.

Many thanks for all of your efforts on this, I was indeed lost.

Cheers,

Chris

 

by: salesalePosted on 2004-07-15 at 02:12:27ID: 11557125

BABAR NETXS
How to use Lefter outer join  in query two times
 

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...