2017-10-04 83 views
0

我有一個#tmp表,並且我需要從LEFT表和RIGHT表中找到具有匹配的名稱和覆蓋範圍的所有記錄。SQL JOIN:在匹配時從左和右表中返回行

-- select * from #tmp 
--#tmp table 
ID Name IsConverted Coverage EarliestPolicyEffectiveDate 
1 abc 1   Test1  9/1/2017 
2 abc 0   Test1  9/2/2017 
3 abc 0   Auto  9/3/2017 
4 xyz 0   Home  9/3/2017 

-- select * from #tmp where IsConverted = 0 
--LEFT TABLE 
ID Name IsConverted Coverage 
2 abc 0   Test1 
3 abc 0   Auto 
4 xyz 0   Home 

-- select * from #tmp where IsConverted = 1 
--RIGHT TABLE 
ID Name IsConverted Coverage 
1 abc 1   Test1 

-- DESIRED RESULTS 
ID Name IsConverted Coverage 
1 abc 1   Test1 
2 abc 0   Test1 

-- CURRENT RESULTS 
ID Name IsConverted Coverage 
2 abc 0   Test1 



select * 
from 
    (SELECT * FROM #tmp tmp WHERE tmp.IsConverted = 0) nc 
join 
    (SELECT * FROM #tmp tmp WHERE tmp.IsConverted = 1) ic on ic.Name = nc.Name and ic.Coverage = nc.Coverage 

我需要能夠從左右兩個表中獲取匹配記錄。這是非常複雜的原因,並沒有爲這篇文章添加任何額外的信息。

我試過全外聯接,交叉應用,外部應用。沒有任何工作。

編輯:

最好我想使用JOIN,因爲一旦我找到匹配的結果,我仍需要訪問左表和右表,因爲我需要內確保LEFT.EarliestPolicyEffectiveDate 15天的RIGHT.EarliestPolicyEffectiveDate。

我不確定我能做到這一點,如果我做的聯盟。

像下面的例子:

select * 
from 
    (SELECT * FROM #tmp tmp WHERE tmp.IsConverted = 0) nc 
join 
    (SELECT * FROM #tmp tmp WHERE tmp.IsConverted = 1) ic on ic.Name = nc.Name and ic.Coverage = nc.Coverage 
where 
    nc.EarliestPolicyEffectiveDate between DATEADD(d, -15, ic.EarliestPolicyEffectiveDate) and DATEADD(d, 15, ic.EarliestPolicyEffectiveDate) 
+0

爲什麼ID 2在您想要的結果,但不是ID 3或4? –

+0

@TabAlleman沒有匹配的'Coverage'值 – Lamak

+0

@Lamak看起來像它匹配我..'#tmp'到'left table'。 –

回答

3

我認爲有更好的方法可以做到這一點,但UNION ALLEXISTS似乎在這裏工作:

SELECT * 
FROM #tmp t 
WHERE IsConverted = 1 
AND EXISTS(SELECT 1 FROM #tmp 
      WHERE IsConverted = 0 
      AND Name = t.Name 
      AND Coverage = t.Coverage) 
UNION ALL 
SELECT * 
FROM #tmp t 
WHERE IsConverted = 0 
AND EXISTS(SELECT 1 FROM #tmp 
      WHERE IsConverted = 1 
      AND Name = t.Name 
      AND Coverage = t.Coverage); 
0

我想我現在是你想看到將LEFT TABLE直接連接到RIGHT TABLE,而不是使用#tmp作爲中間連接。

你需要將它們相交的兩個位置聯合起來。

僞代碼:

SELECT * FROM LEFT TABLE WHERE EXISTS(matching row in RIGHT TABLE) 
UNION 
SELECT * FROM RIGHT TABLE WHERE EXISTS(matching row in LEFT TABLE) 
1

這對我的作品。有一個子查詢來獲取LEFT和RIGHT之間的所有匹配名稱。和一個子查詢來獲得所有匹配的左和右之間的覆蓋。然後用 'AND' 他們在一起WHERE子句中的鏈接

select * from #tmp 
where name in (Select LEF.Name from LEF 
       INNER JOIN RIG ON LEF.NAME = RIG.NAME) 
     and coverage in (Select LEF.coverage from LEF 
       INNER JOIN RIG ON LEF.coverage = RIG.coverage) 

結果:

ID   NAME  IsConverted Coverage EarliestPolicyEffectiveDate 
----------- ---------- ----------- ---------- --------------------------- 
1   abc  1   Test1  2017-09-01 
2   abc  0   Test1  2017-09-02 
相關問題