Sql Server连接表并合并一些行

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

有三个表格如下: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  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)