Join on the basis of a value that can present in multiple column

Răspuns Join on the basis of a value that can present in multiple column

  • Monday, August 20, 2012 7:48 AM
     
     

    Hi,

    I've one source table that contains names and contact numbers for example shown as under.

    Name ContactNumber
    Annie 9999555515
    Bobby 054321453
    Danhy 9090876543
    Emma 044367212
    A Roomy 034567852

    Now i've another table that contains all type of contacts example.

    ID Type Of Contact Name Home Office Mobile
    1 Primary Annie Roomy 034567852 034567852  9999555515
    2 Primary Bobby 054321452 Null 9899987534
    2 Secondary Bobby 054321452 Null 9899987535
    3 Primary Danhy 9090876543 Null 9090876543
    4 Primary Emma 044367212 044367212 Null

    Now i want to find out names based on matching contact number in the above columns.

    Suppose for Annie I want to search 9999555515 in all the three columns and if exists i'll list down the names and contact from source table.

    Bobby contains two rows of data and both has the matching contact number.

    I dont know how to find out this type of records using SQL. 

    I can also store temporary result set if required.

    Please help.

All Replies

  • Monday, August 20, 2012 7:58 AM
    Answerer
     
     Proposed

    Sorry untested

    SELECT * FROM tbl2 WHERE EXISTS (SELECT * FROM tb1 WHERE tbl2.ContactNumber=tb1.Home OR 

     tbl2.ContactNumber=tb1.Office OR tbl2.ContactNumber=tb1.Mobile)


    Best Regards,Uri Dimant SQL Server MVP,http://sqlblog.com/blogs/uri_dimant/

    • Proposed As Answer by ank hit Monday, August 20, 2012 12:35 PM
    •  
  • Monday, August 20, 2012 8:03 AM
    Moderator
     
     Answered

    Try

    select S.*, T.* from Source S inner join AnotherTable T ON S.ContactNumber IN (Coalesce(T.Home,''), COALESCE(T.Office, ''), COALESCE(T.Mobile,''))


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    • Proposed As Answer by ank hit Monday, August 20, 2012 12:35 PM
    • Marked As Answer by Mannu S Tuesday, August 21, 2012 10:44 AM
    •  
  • Monday, August 20, 2012 10:15 AM
     
     Answered Has Code

    Try this,

    declare @tab1 table
    (Name varchar(50),	ContactNumber bigint)
    insert into @tab1 values('Annie',	9999555515),
    ('Bobby',	054321453),
    ('Danhy',	9090876543),
    ('Emma',	044367212),
    ('A Roomy',	034567852)
    
    
    declare @tab2 table(ID int identity(1,1),	TypeOfContact	varchar(15),Name	varchar(50),Home	bigint,Office	bigint,Mobile bigint)
    insert into @tab2 values
    ('Primary','Annie Roomy',	034567852,	034567852	, 9999555515),
    ('Primary','Bobby',	054321453,	Null	,9899987534),
    ('Secondary','Bobby',	054321453,	Null	,9899987535),
    ('Primary','Danhy',	9090876543	,Null	,9090876543),
    ('Primary','Emma',	044367212,	044367212	,Null)
    
    
    select t1.Name Name_1,t2.name Name_2,TypeOfContact, ContactNumber,Home,Office,Mobile from @tab1 t1 inner join @tab2 t2
     on( t1.ContactNumber=t2.Home Or  t1.ContactNumber=t2.Office Or  t1.ContactNumber=t2.Mobile)

    Hope this helps

    Regards
    Satheesh

    • Proposed As Answer by ank hit Monday, August 20, 2012 12:35 PM
    • Marked As Answer by Mannu S Tuesday, August 21, 2012 10:44 AM
    •  
  • Tuesday, August 21, 2012 10:41 AM
     
     

     Hi,
     
     And if my Source table contains the following.
     
     declare @tab1 table
    (Name varchar(50), Home bigint,Office bigint,Mobile bigint)
    insert into @tab1 values('Annie', 9999555515, 034567852, 034567852),
    ('Bobby', 054321453, 9899987534, 9899987534),
    ('Danhy', 9090876543, 9090876543, 9090876543),
    ('Emma', 044367212, 044367212, Null),
    ('A Roomy', 034567852,9999555515, 9999555515 )

    And if I want to Look for Home Contact first in the Home, Office and Mobile from the Table 2
    then Office in the Home, Office and Mobile from the Table 2
    then Mobile in  the Home, Office and Mobile from the Table 2

    This means I want If one Contact matches any other Contact in the other columns.

    How i can i achieve the same?

  • Tuesday, August 21, 2012 10:50 AM
    Moderator
     
      Has Code

    Try:

    DECLARE @tab1 TABLE (
    	NAME VARCHAR(50)
    	,Home BIGINT
    	,Office BIGINT
    	,Mobile BIGINT
    	)
    
    INSERT INTO @tab1
    VALUES (
    	'Annie'
    	,9999555515
    	,034567852
    	,034567852
    	)
    	,(
    	'Bobby'
    	,054321453
    	,9899987534
    	,9899987534
    	)
    	,(
    	'Danhy'
    	,9090876543
    	,9090876543
    	,9090876543
    	)
    	,(
    	'Emma'
    	,044367212
    	,044367212
    	,NULL
    	)
    	,(
    	'A Roomy'
    	,034567852
    	,9999555515
    	,9999555515
    	)
    
    DECLARE @tab2 TABLE (
    	ID INT
    	,[Type Of Contact] VARCHAR(10)
    	,[Name] VARCHAR(20)
    	,Home BIGINT
    	,Office BIGINT
    	,Mobile BIGINT
    	)
    
    INSERT INTO @tab2
    VALUES (
    	1
    	,'Primary'
    	,'Annie Roomy'
    	,034567852
    	,034567852
    	,9999555515
    	)
    	,(
    	2
    	,'Primary'
    	,'Bobby'
    	,054321452
    	,NULL
    	,9899987534
    	)
    	,(
    	2
    	,'Secondary'
    	,'Bobby'
    	,054321452
    	,NULL
    	,9899987535
    	)
    	,(
    	3
    	,'Primary'
    	,'Danhy'
    	,9090876543
    	,NULL
    	,9090876543
    	)
    	,(
    	4
    	,'Primary'
    	,'Emma'
    	,044367212
    	,044367212
    	,NULL
    	)
    
    SELECT T1.*
    	,T2.*
    FROM @tab1 T1
    INNER JOIN @tab2 T2 ON T1.Home IN (
    		T2.Home
    		,T2.Office
    		,T2.Mobile
    		)
    
    UNION
    
    SELECT T1.*
    	,T2.*
    FROM @tab1 T1
    INNER JOIN @tab2 T2 ON T1.Office IN (
    		T2.Home
    		,T2.Office
    		,T2.Mobile
    		)
    
    UNION
    
    SELECT T1.*
    	,T2.*
    FROM @tab1 T1
    INNER JOIN @tab2 T2 ON T1.Mobile IN (
    		T2.Home
    		,T2.Office
    		,T2.Mobile
    		)


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

  • Tuesday, August 21, 2012 11:28 AM
     
     

    Hi Naomi,

    In this sample example it works fine but i've real data that contains lakhs of Records.

    And searching like that will be very slow.

    Is there any other way round.

  • Tuesday, August 21, 2012 11:41 AM
    Moderator
     
     Answered
    If you can fix your structure and have one column with phone number and another with the type, then you should be able to index that column and simply join based on the column in both tables. As long as you keep your current structure, all solutions will be similar to what I posted and will not perform too well.

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    • Marked As Answer by Mannu S Wednesday, August 22, 2012 9:41 AM
    •