討論區快速選單
知識庫快速選單
掌握Salesforce雲端管理秘訣 軟體開發過程中有哪些資安漏洞? 討論區最近新進100則主題
[ 回上頁 ] [ 討論區發言規則 ]
3個Table串起來的問題
更改我的閱讀文章字型大小
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/12 下午 04:59:35
假如現在有3個Table

TableA 是Tree狀Menu的清單
TableB 是權限的控管項目名稱
TableC 是實際設定各User的權限明細 (用UserID當查詢的條件)

現在的問題是

TableA 與 TableB 透過ProgName做對應
TableB 與 TableC 透過FuncID做對應

請問這種情況下
假如我以UserID當參數的話
TableA 該怎麼跟TableC 用1個SQL命令接起來?


--------------------
CREATE TABLE [dbo].[TableA](
[NoteID] [int] IDENTITY(1,1) NOT NULL,
[ParentID] [int] NULL,
[ProgName] [nvarchar](50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
[Url] [varchar](100) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
[Target] [varchar](20) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
 CONSTRAINT [PK_TableA] PRIMARY KEY CLUSTERED
(
[NoteID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

--------------------
CREATE TABLE [dbo].[TableB](
[FuncID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[ProgName] [nvarchar](20) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
[FileName] [nvarchar](22) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
 CONSTRAINT [PK_TableB] PRIMARY KEY CLUSTERED
(
[FuncID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

--------------------
CREATE TABLE [dbo].[TableC](
[ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[UserID] [int] NOT NULL,
[FuncID] [int] NOT NULL,
[CanRead] [char](1) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
[CanInsert] [char](1) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
[CanUpdate] [char](1) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
[CanDelete] [char](1) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
[CanPrint] [char](1) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
 CONSTRAINT [PK_TableC] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/12 下午 05:06:57
我需要取出TableA的所有欄位
以及TableC的CanRead
(以UserID當查詢條件, 然後從 TableA -> TableB -> TableC 這樣串起來)

作為當使用者沒有讀取權限時
把該項的Menu隱藏起來的判斷依據
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/12 下午 05:17:05
SELECT distinct
a.*,
IsRead = (select top 1 c.CanRead from [TableC] c, [TableB] b where c.[UserID]=@UserID and a.[ProgName]=b.[ProgName] and b.[FuncID]=c.[funcID])
FROM [TableA] a
where a.[ParentId]>=0
order by a.[NoteId]

我用這樣串
可是看起來還怪怪的?

有更好的寫法嗎?
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人player註記此篇回應為很有道理 2007/10/12 下午 05:18:54
SELECT a.*, r.* FROM TableA a INNER JOIN (
SELECT c.*, b.ProgName, b.FileName FROM TableC c INNER JOIN TableB b ON c.FuncID = b.FuncID) r
ON a.ProgName = r.ProgNme
作者 : bensontan(Benson) 貼文超過1000則人氣指數超過30000點
[ 貼文 1056 | 人氣 40462 | 評價 3290 | 評價/貼文 3.12 | 送出評價 80 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人player註記此篇回應為很有道理 2007/10/12 下午 05:30:38
大約寫一寫, 試試看吧~
SELECT A.NodeID, A.ParentID, A.ProgName, A.Url, A.Target, B.FunID
FROM TableC C
LEFT JOIN TableB B On B.FunID = C.FunID
LEFT JOIN TableA A On A.ProgName = B.ProgName
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/12 下午 06:59:25
to regionbbs(小朱) :
你的方法, 會跑出重複的資料一堆
因為TableC 裡的資料是多人份的
你給的SQL沒把篩選條件 UserID 加進去
我也想過用 join 可是3個Table就不知道該怎麼把篩選UserID加進去了
(MsSQL老是說語法錯誤, 或是 "無效的資料行名稱")

to bensontan(Benson) :
你的方法MsSQL跑不起來
"無效的資料行名稱"
看起來不能這樣串?
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/12 下午 09:45:36
我沒加,你不會自己加嗎 ...
我又沒你的資料可以測試,只能依你的資料結構來寫。
 板主 : 徵求中
 > SQL Server 7/2000 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - SQL Server 7/2000 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
SQL Server 7/2000
1 小朱 1540 
2 小台 1520 
3 Gordon 600 
4 ㄉ一ˊㄎㄜˋ 580 
5 路人 490 
6 max 470 
7 william 410 
8 Aries 250 
9 阿利 180 
10 羅啟章 160 
SQL Server 7/2000
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875