Sql Server连接表并合并一些行
有三个表格如下:A代表塔台信息,B代表防守方信息,C代表他们之间的关系Sql Server连接表并合并一些行,sql,sql-server,Sql,Sql Server,有三个表格如下:A代表塔台信息,B代表防守方信息,C代表他们之间的关系 TableA: TowerID TowerName DefenderName 1 TwA DefA 2 TwB DefB 3 TwC DefA,DefB TableB: DefenderID DefenderName 1 DefA 2 DefB TableC: TowerID Defende
TableA:
TowerID TowerName DefenderName
1 TwA DefA
2 TwB DefB
3 TwC DefA,DefB
TableB:
DefenderID DefenderName
1 DefA
2 DefB
TableC:
TowerID DefenderID
1 1
2 2
3 1
3 2
我使用以下sql语句将它们连接起来:
SELECT * FROM
(SELECT TableA.TowerID,TableA.TowerName,TableA.DefenderName,TableC.DefenderID
FROM TableA,TableC
WHERE TableA.TowerID = TableC.TowerID) AS tbl
TowerID TowerName DefenderName DefenderID
1 TwA DefA 1
2 TwB DefB 2
3 TwC DefA,DefB 1
3 TwC DefA,DefB 2
如果DefA登录,我可以在该语句后面附加以下内容:
WHERE DefenderID = 1
他会看到的
TowerID TowerName DefenderName DefenderID
1 TwA DefA 1
3 TwC DefA,DefB 1
如果DefB登录,则DefenderID=2
如果King登录,我想向他展示如下内容:
TowerID TowerName DefenderName
1 TwA DefA
2 TwB DefB
3 TwC DefA,DefB
我如何修改sql语句来向King显示上面的表,当DefA或DefB登录时,我需要做的就是在sql中附加一个“WHERE DefenderID='x'”,而他们只会看到自己的信息
(列DefenderID不是必需的)如果您想添加where子句,听起来您正在处理一个动态查询。如果您有一个与会话登录名匹配的用户表,那么它可能会变得更复杂,但现在应该可以:
Declare @Sql Varchar(8000)
Set @Sql =
'SELECT * FROM
(SELECT TableA.TowerID,TableA.TowerName,TableA.DefenderName
FROM TableA,TableC
GROUP BY TowerID, TowerName, DefenderName
WHERE TableA.TowerID = TableC.TowerID) AS tbl'
If @User = 'DefA'
Set @Sql = @Sql + ' Where DefenderID = 1'
Else If @User = 'DefB'
Set @Sql = @Sql + ' Where DefenderID = 2 '
Else If @User = 'King'
Set @Sql = @Sql + ' Where 1 = 1 '
Else
Set @Sql = 'Error handling goes here, for now query will error instead '
Exec (@Sql)
这里我设置了
@Sql=@Sql+'Where 1=1'
,只要一个空字符串就可以了@Sql=@Sql+'
查找参数化存储过程。谁是King login
?“King”是可以查看所有King查询的管理员,您应该有两个独立的查询。tbl仍然有两行,其towerid为3,一行的defenderid为1,当我包括“DISTINCT”时,另一行的defenderid为2。有办法把他们合并吗?国王呢?他能看到所有的塔任何一个没有被定义为用户的人都是“国王”。我将编辑以明确引用他。问题是您将获得两次行3 TwC DefA,DefB
。这不是我的愿望,但我没看到,谢谢。由一个或几个不同的小组负责。因为不需要防守者ID,所以我们可以省略它。答案已更新。
Declare @Sql Varchar(8000)
Set @Sql =
'SELECT * FROM
(SELECT TableA.TowerID,TableA.TowerName,TableA.DefenderName
FROM TableA,TableC
GROUP BY TowerID, TowerName, DefenderName
WHERE TableA.TowerID = TableC.TowerID) AS tbl'
If @User = 'DefA'
Set @Sql = @Sql + ' Where DefenderID = 1'
Else If @User = 'DefB'
Set @Sql = @Sql + ' Where DefenderID = 2 '
Else If @User = 'King'
Set @Sql = @Sql + ' Where 1 = 1 '
Else
Set @Sql = 'Error handling goes here, for now query will error instead '
Exec (@Sql)