ronibd
ronibd

Reputation: 113

SQL Server - Get data from two tables and within a table

Please see my table and data below -

DECLARE @test1 TABLE (Ref nvarchar(10) NULL, Dates datetime NULL);
INSERT INTO @test1(Ref, Dates) 
VALUES 
('R1', '2018-10-26'),
('R2', '2018-10-26'),
('R5', null);

DECLARE @test2 TABLE (P_Ref nvarchar(50) null, Name nvarchar(50) null);
INSERT INTO @test2(P_Ref, Name)
VALUES 
('R1', 'N1'),
('R1', 'N2'),
('R2', 'N1'),
('R2', 'N2'),
('R3', 'N1'),
('R3', 'N2'),
('R4', 'N2'),
('R5', 'N3'),
('R6', 'N3'),
('R7', 'N4');

I am using where condition in table 1 @test1, it's Ref column join with table 2 @test2 P_Ref column. I want all the related data from both tables as well as all the matches Name from @test2 table

My query is -

select t1.Ref, t2.P_Ref, t2.Name from
@test1 t1
right join @test2 t2
on t1.Ref = t2.P_Ref
where t1.Dates is not null

The output I am getting -

   Ref    P_Ref    Name
    R1      R1      N1
    R1      R1      N2
    R2      R2      N1
    R2      R2      N2

I am looking below output -

   Ref    P_Ref    Name
    R1      R1      N1
    R1      R1      N2
    R2      R2      N1
    R2      R2      N2
    NULL    R3      N1
    NULL    R3      N2
    NULL    R4      N2

Could someone please help me how to achieve this.

Thanks in advance

Upvotes: 5

Views: 74

Answers (4)

Bacon Bits
Bacon Bits

Reputation: 32170

The problem is that your WHERE clause is turning your outer join into an implicit inner join. To filter the outer table, it's usually easiest to move the filter condition for the outer table to the join condition.

select t1.Ref, t2.P_Ref, t2.Name from
@test1 t1
right join @test2 t2
    on  t1.Ref = t2.P_Ref
    and t1.Dates is not null

Upvotes: 0

Naim Halai
Naim Halai

Reputation: 375

If there are large number of records expected whose Dates may not be NULL then an optimized option will be as below.

IF OBJECT_ID('tempdb..#ValidRecords') IS NOT NULL
    DROP TABLE #ValidRecords

SELECT DISTINCT t2.[Name]
INTO #ValidRecords
FROM @test1 t1
JOIN @test2 t2 ON t1.Ref = t2.P_Ref
WHERE t1.Dates IS NOT NULL

SELECT Ref,
t2.P_Ref,
t2.[Name]
FROM @test1 t1
RIGHT JOIN @test2 t2 ON t1.Ref = t2.P_Ref
INNER JOIN #ValidRecords vr ON vr.[Name] = t2.[Name]

Upvotes: 0

Suraj Kumar
Suraj Kumar

Reputation: 5643

Try the below query

select t1.Ref, t2.P_Ref, t2.Name from
@test1 t1 right join @test2 t2
on t1.Ref = t2.P_Ref
where Name in ('N1', 'N2')

Upvotes: 0

Sergey Menshov
Sergey Menshov

Reputation: 3906

Try the following query

SELECT t1.Ref, t2.P_Ref, t2.Name
FROM @test1 t1
RIGHT JOIN @test2 t2 ON t1.Ref = t2.P_Ref
WHERE t2.Name IN(
    SELECT DISTINCT t2.Name
    FROM @test1 t1
    JOIN @test2 t2 ON t1.Ref = t2.P_Ref
    WHERE t1.Dates IS NOT NULL
  )

Upvotes: 2

Related Questions