2008-10-02 97 views
2

我有3個表SQL加入問題

  1. 鏈接
    鏈路ID
    鏈接名稱
    羣ID(FK成組)
    SubGroupID(FK爲子組)


  2. GroupID
    組名


  3. SubGroupID
    SubGroupName
    羣ID(FK成組)

每一個環節都需要有一個組ID,但德SubGroupID是可選的。我怎樣寫一個SQL查詢,以顯示:

Links.LinkName,Groups.GroupName,SubGroup.SubGroupName

對於記錄沒有亞組只是把在該領域的一個空白項。如果我有250個鏈接行,我應該從這個查詢中獲取250個reecords。

有沒有辦法做到這一點在一個查詢或我需要做多個查詢?

回答

5

這假定每個羣組最多隻有1個小組。如果還有更多,那麼你有可能獲得額外的記錄。

select links.linkname, groups.groupname, subgroup.subgroupname 
from links 
    inner join groups on (links.groupid = groups.groupid) 
    left outer join subgroup on (links.subgroupid = subgroup.subgroupid) 
+0

我在使用SQL時遇到這個錯誤: 查詢表達式中的語法錯誤(缺少運算符)links.groupid = groups.groupid)(links.subgroup = subgroupd.subgroup.id)上的左外部連接子羣 – leora 2008-10-02 14:53:27

+0

看起來像我拼錯的鏈接名稱。固定。 – NotMe 2008-10-02 15:45:56

1
SELECT 
    links.linkname 
    , groups.groupname 
    , subgroup.groupname 
FROM 
    links 
    JOIN groups ON links.groupid = groups.groupid 
    LEFT OUTER JOIN subgroups ON links.subgroupid = subgroup.subgroupid 

(重新添加到解決OP的問題) 順便說一下,爲什麼不保持組和子組在同一個表,並使用一個自我指涉的加入?

Akantro:

你會是這樣的: 創建表組( GROUPID整數主鍵, parentgroupid整數外鍵引用組(組識別), 組名VARCHAR(50))

您的查詢將被

SELECT 
    links.linkname 
    , groups.groupname 
    , SUBGROUPS.groupname 
FROM 
    links 
    JOIN groups ON links.groupid = groups.groupid 
    LEFT OUTER JOIN groups SUBGROUPS ON links.subgroupid = subgroup.groupid 

有對保持這樣的表沒有功能上的差異,但它的好處是你ONL y必須去一個地方編輯羣組/小組

+0

你能解釋一下你將如何做到這一點? – leora 2008-10-02 14:12:14

0

你不是太清楚,但我想你想獲得的所有行,包括那些沒有一個記者小組中的表。

爲此,您可以使用LEFT JOIN,如果沒有匹配的行,它將讀取NULL。

1
SELECT Links.LinkName, Groups.GroupName, SubGroup.SubGroupName -- Will potentially be NULL 
FROM Links 
INNER JOIN Groups 
    ON Group.GroupID = Links.GroupID 
LEFT JOIN SubGroup 
    ON SubGroup.SubGroupID = Links.SubGroupID 
1

你會使用一個外連接:

select Links.LinkName, Groups.GroupName, SubGroup.SubGroupName 
from Links 
inner join Groups on Groups.GroupID = Links.GroupID 
left outer join SubGroup on Links.SubGroupID = SubGroup.SubGroupID 
0

只需使用LEFT OUTER在亞表連接,如:

select 
    l.LinkName, 
    g.GroupName, 
    s.SubGroupName 
from 
    Links l 
' 
    JOIN Group g 
     on (g.GroupId = l.GroupId) 
' 
    LEFT OUTER JOIN SubGroup s 
     on (s.SubGroupId = l.SubGroupId) 

應該這樣做。

0
SELECT LinkName, GroupName, SubGroupNamne 
FROM Links INNER JOIN Groups ON LInks.GroupID = Groups.GroupID 
    LEFT JOIN SubGroup ON Links.SubGroupID = SubGroup.SubGroupID 

這將包括沒有子組的行。該列將僅爲NULL。

0
select L1.LinkName, G1.GroupName, NVL(S1.SubGroupName,' ') 
from Links L1, Groups G1, SubGroup S1 
where L1.GroupID = G1.GroupID and 
     L1.GroupID = S1.GroupID 
0

好了,試試:

select a.linkname, b.groupname, c.subgroupname 
from links a, groups b, subgroup c 
where a.groupid = b.groupid 
and a.subgroupid = c.subgroupid 
and a.subgroupid is not null 
union all 
select a.linkname, b.groupname, ' ' 
from links a, groups b 
where a.groupid = b.groupid 
and a.subgroupid is null 

我認爲應該工作(它在DB2這是我最常用的DBMS) - 你需要在第二個選擇,以調整空間匹配subgroup.subgroupname大小。

0

使用LEFT OUTER JOIN在亞表會給你從鏈接表,其中一個分組存在將返回,否則你看到一個NULL值的所有行。

SELECT L.LinkName, G.GroupName, S.SubGroupName 
FROM Links As L 
    INNER JOIN Groups As G ON L.GroupID=G.GroupID 
    LEFT OUTER JOIN SubGroup S ON L.SubGroupID=S.SubGroupID 

不檢查你的SubGroups.LinkID相匹配的Links.LinkID這是不可能發生的,但如果你需要檢查這然後在另一個條款添加到加盟:

SELECT L.LinkName, G.GroupName, S.SubGroupName 
FROM Links As L 
    INNER JOIN Groups As G ON L.GroupID=G.GroupID 
    LEFT OUTER JOIN SubGroup S ON L.SubGroupID=S.SubGroupID AND L.GroupID=S.GroupID