2011-11-04 63 views
1

我想在一對多關係(使用SQL或Hibernate)上做一個外部聯接,我嘗試一個錯誤的語法,或者是這是不可能的設計?在一對多關係上的外部聯接(Hibernate/SQL)

讓我們舉一個簡單的例子:用戶可以更改參數的值。對於沒有用戶值參數,則使用默認值:

Table **PARAMETER** : 
PAR_ID 
PAR_NAME 
PAR_DEFAULT_VALUE 

Table **USER_PARAMETER** : 
UP_ID 
UP_PAR_ID 
UP_US_ID 
UP_CUSTOM_VALUE 

Table **USER** : 
US_ID 
US_LOGIN 

對於一個給定的用戶,我想列出他們的默認值,他們的自定義值的所有參數,如果用戶給出一個(和「空」如果它沒有這個用戶的任何自定義值)。

我試過下面的請求,但如果用戶沒有定製的值將沒有返回值:

SELECT PAR_NAME, PAR_DEFAULT_VALUE, UP_CUSTOM_VALUE 
FROM PARAMETER 
LEFT JOIN USER_PARAMETER on UP_PAR_ID = PAR_ID 
WHERE UP_US_ID = 1 

我本來期望PAR_NAME和PAR_DEFAULT_VALUE填寫每個現有的參數,並UP_CUSTOM_VALUE填寫用戶定製參數(其他參數爲「null」)。

回答

1

where子句移動條件us_id = 1on子句:

select * 
from parameter p 
left join 
     user_parameter up 
on  up.up_par_id = p.par_id 
     and up.up_us_id = 1 

這將導致該條件被應用爲left join,這將只從右側表濾除行的一部分。條款where不知道左或右。

看看下面這個例子的數據看出爲什麼where條件會過濾掉所有行,而不自定義值:

par_id default_value user_id custom_value 
1  1    1  2    --> works 
2  1    null null   --> filtered out by UP_US_ID = 1 
+0

你說得對,它的工作原理。我以爲我已經嘗試過這個......並且使用HQL,它也可以使用「with」關鍵字。 – Tristan