2011-05-11 91 views
1

我已經在我的數據庫表聯接:幫助,親子關係

id grp# code parent# 
-- ---- ---- ------- 
0  10 US  NULL  
0  30 SF   10 
1  10 S  NULL 
1  30 SF   10 

由此看來,給定一個ID和GRP#我需要回到孩子的清單及代碼GRP#。如果孩子不存在,它應該返回NULL。

因此,對於例如:ID = 0,GRP#= 10,它應該返回美國,30和ID = 0,GRP#= 30,它應該返回SF,NULL

注:不應該有重複在輸出中。

+0

您需要詳細說明。我已經多次閱讀這個問題和你的例子,但仍然不知道你在問什麼。什麼是「兒童名單」?什麼定義了這個孩子? – cmutt78 2011-05-11 18:14:42

+0

grp#和父母#跟隨子女 - 父母關係。 10是30的父親,即30是10的孩子。所以如果我們查詢id = 0和grp#= 10,我們需要返回30和US。如果我們查詢id = 0和grp#= 30,我們需要返回NULL和SF。 – kate 2011-05-11 18:18:05

回答

2

因此,這裏是你的測試數據:

SQL> select * from t42 
    2/

     ID  GRP# CODE     PARENT# 
---------- ---------- -------------------- ---------- 
     0   10 US 
     0   30 SF       10 
     1   10 S 
     1   30 SF       10 

SQL> 

這裏是返回結果的查詢你想要的:

SQL> select p.code 
    2   , c.grp# as child_grp# 
    3 from t42 p 
    4  left outer join t42 c 
    5  on (c.parent# = p.grp#) 
    6 where p.id = &id 
    7 and p.grp# = &grp 
    8/
Enter value for id: 0 
old 6: where p.id = &id 
new 6: where p.id = 0 
Enter value for grp: 10 
old 7: and p.grp# = &grp 
new 7: and p.grp# = 10 

CODE     CHILD_GRP# 
-------------------- ---------- 
US       30 
US       30 

SQL> r 
    1 select p.code 
    2   , c.grp# as child_grp# 
    3 from t42 p 
    4  left outer join t42 c 
    5  on (c.parent# = p.grp#) 
    6 where p.id = &id 
    7* and p.grp# = &grp 
Enter value for id: 0 
old 6: where p.id = &id 
new 6: where p.id = 0 
Enter value for grp: 30 
old 7: and p.grp# = &grp 
new 7: and p.grp# = 30 

CODE     CHILD_GRP# 
-------------------- ---------- 
SF 

SQL> 

「我們可以重寫查詢返回單行而不是 重複?「

當然 - 只要您可以指定附加業務規則。

最簡單的方法就是部署DISTINCT關鍵字,這是破壞查詢的最後一個手段。

+0

感謝您的快速回答。但正如您在第一個查詢中看到的那樣,您將獲得兩次輸出。這是因爲第二行的連接和c.id爲1。我不想那樣。我們可以重寫查詢來返回一行而不是重複嗎? – kate 2011-05-11 18:32:55

+0

它看起來像連接條件應該是2列而不是一個。就像(c.parent#= p.grp#和c.id = p.id) – 2011-05-11 19:54:16

+0

@ToddPierce - 這也是我的猜測,但我們不應該猜測。這個問題應該有所有相關的細節。 – APC 2011-05-11 20:24:36