2014-02-18 69 views
2

我有一個包含員工的薪資等級,如表稱爲hr_grades: -SQL不喜歡通配符條件對內部連接

ID hr_grade 
1 PR07 
2 AC04 

我運行兩個存儲過程。一個返回員工的成績在這張表中,而另一個沒有。這些存儲過程執行許多不同的任務來準備數據以加載到最終系統中。

我希望查詢對等級表中的行執行通配符搜索。因此,例如,對員工,其成績表中的

SELECT DISTINCT 
    Employee_ID,    
FROM 
    @tmp_vo_hr_acp_staff v 
INNER JOIN 
    hr_grades g ON v.hr_grade LIKE g.HR_Grade + '%' -- wildcard search 

的原因通配符是,hr_grades可以像AC04(1),AC04(2)等

這工作得很好。不過,我正在努力爭取這項工作的逆轉。

SELECT DISTINCT 
     Employee_ID,    
    FROM 
     @tmp_vo_hr_acp_staff v 
    INNER JOIN 
     hr_grades g ON v.hr_grade NOT LIKE g.HR_Grade + '%' 

任何想法如何我可以得到這個通配符搜索工作在不類似的條件?

回答

2

由於幾乎總是在SQL中,有一些方法可以做到這一點:

-- 1. using outer join where the outer table don't match 
SELECT DISTINCT Employee_ID 
FROM @tmp_vo_hr_acp_staff v 
LEFT JOIN hr_grades g ON (v.hr_grade LIKE g.HR_Grade + '%') -- wildcard search 
WHERE g.id IS NULL -- use any non nullable column from hr_grades here 

-- 2. using EXISTS for set difference 
SELECT DISTINCT Employee_ID 
FROM @tmp_vo_hr_acp_staff v 
WHERE NOT EXISTS (
    SELECT 'x' FROM hr_grades g WHERE v.hr_grade LIKE g.HR_Grade + '%' 
) 

-- 3. using the less popular ANY operator for set difference 
SELECT DISTINCT Employee_ID 
FROM @tmp_vo_hr_acp_staff v 
WHERE NOT v.hr_grade LIKE ANY (
    SELECT g.HR_Grade + '%' FROM hr_grades g 
) 

就個人而言,我不喜歡使用連接過濾,所以我可能會使用選項2,如果hr_grades是多少然而,小於@tmp_vo_hr_acp_staff,您可以從使用選項3中受益(因爲可以事先確定集合,而不是使用單個讀取操作進行緩存)。

+0

帶選項2.謝謝。 –

4

將其更改爲

ON NOT (v.hr_grade LIKE g.HR_Grade + '%') 

編輯:

刪除括號內的ON

+0

感謝您的回覆,但我似乎無法得到那個工作。你的意思是: - \t FROM \t \t tmp_vo_hr_acp_staff v \t \t INNER JOIN \t \t uol_acp_prof_grades G於NOT(ON v.hr_grade LIKE g.HR_Grade + '%') –

+0

是第二'ON'應該在那裏? – OGHaza

+0

@AndyB,對不起,修好了。 –