SQL-查找与多个/变量表变量行组合关联的外键ID

SQL-查找与多个/变量表变量行组合关联的外键ID,sql,sql-server,tsql,Sql,Sql Server,Tsql,在Microsoft SQL Server存储过程中,我有一个表变量,@PlayerComboStrategy,它的行数和列数是可变的PLAYER\u ID,POSITION\u code,STATUS\u code 我正在寻找最有效的方法来检索与所有表变量行(如果存在)的精确组合相关联的STRATEGY\u ID。换句话说,我如何找到包含所有玩家ID及其特定位置\u code和状态\u code的策略ID。如果它不存在,我将在存储过程中继续创建它 我正在考虑为匹配PLAYER\u ID、POS

在Microsoft SQL Server存储过程中,我有一个表变量,
@PlayerComboStrategy
,它的行数和列数是可变的
PLAYER\u ID
POSITION\u code
STATUS\u code

我正在寻找最有效的方法来检索与所有表变量行(如果存在)的精确组合相关联的
STRATEGY\u ID
。换句话说,我如何找到包含所有
玩家ID
及其特定
位置\u code
状态\u code
策略ID
。如果它不存在,我将在存储过程中继续创建它

我正在考虑为匹配
PLAYER\u ID
POSITION\u code
STATUS\u code
组合的每一行提取一个所有
STRATEGY\u ID
的列表,看看列表之间是否有一个公共ID。但是,例如,如果三个玩家(及其位置和状态代码)与一个策略相关联,并且完全相同的组合加上一个(或多个)额外玩家与另一个策略相关联,则此操作将失败。也就是说,检索到的
策略ID
必须根据
玩家策略
中的x行数构建,与
@PlayerComboStrategy
中的x行数匹配

@PlayerComboStrategy

+-----------+---------------+-------------+
| PLAYER_ID | POSITION_CODE | STATUS_CODE |
+-----------+---------------+-------------+
|        33 |             2 |           2 |
|        23 |             4 |           1 |
+-----------+---------------+-------------+
PLAYER\u策略示例

+-------------------+-------------+-----------+---------------+-------------+
| PLAYER_STATEGY_ID | STRATEGY_ID | PLAYER_ID | POSITION_CODE | STATUS_CODE |
+-------------------+-------------+-----------+---------------+-------------+
|              1490 |         511 |        64 |             2 |           2 |
|              1491 |         511 |        33 |             2 |           2 |
|              1492 |         511 |        23 |             4 |           1 |
|              1493 |         512 |        33 |             2 |           2 |
|              1494 |         512 |        23 |             5 |           1 |
|              1495 |         513 |        33 |             2 |           2 |
|              1496 |         513 |        23 |             4 |           1 |
|              1497 |         514 |        33 |             2 |           2 |
+-------------------+-------------+-----------+---------------+-------------+
对于这个例子,我希望找到
STRATEGY\u ID=513

WITH matching_strategies AS (
    SELECT strategy_id, COUNT(*) AS matching_strategies
    FROM @PlayerComboStrategy p
    JOIN PLAYER_STRATEGY s
        ON p.player_id = s.player_id
        AND p.position_code = s.position_code
        AND p.status_code = s.status_code
    GROUP BY strategy_id ),
total_strategies AS (
    SELECT p.strategy_id, COUNT(*) AS total_strategies
    FROM PLAYER_STRATEGY p
    JOIN matching_strategies s
        ON p.strategy_id = s.strategy_id
    GROUP BY p.strategy_id )
SELECT ms.strategy_id
FROM matching_strategies ms
JOIN total_strategies ts
    ON ms.strategy_id = ts.strategy_id
    AND ms.matching_strategies = ts.total_strategies
    AND matching_strategies = (SELECT COUNT(*) FROM @PlayerComboStrategy)


第一个CTE将给出与玩家匹配的所有策略的计数。第二个将获得与我们正在寻找的某个球员匹配的球员的策略上的球员总数。最终选择将检查玩家数量是否与总数量匹配,并与正在查找的玩家总数匹配。

这里有一种解决方法。我提供了一个完全有效的示例,这样您就可以看到一种很好且简单的共享数据的方法有多种方法可以解决这类问题,但这是我首先想到的

declare @PlayerStrategy table
(
    PLAYER_STATEGY_ID int
    , STRATEGY_ID int
    , PLAYER_ID int
    , POSITION_CODE int
    , STATUS_CODE int
)

insert @PlayerStrategy values
(1490, 511, 64, 2, 2)
, (1491, 511, 33, 2, 2)
, (1492, 511, 23, 4, 1)
, (1493, 512, 33, 2, 2)
, (1494, 512, 23, 5, 1)
, (1495, 513, 33, 2, 2)
, (1496, 513, 23, 4, 1)
, (1497, 514, 33, 2, 2)

declare @PlayerComboStrategy table
(
    PLAYER_ID int
    , POSITION_CODE int
    , STATUS_CODE int
)

insert @PlayerComboStrategy values
(33, 2, 2)
, (23, 4, 1)


select ps.STRATEGY_ID
from @PlayerStrategy ps
join @PlayerComboStrategy pcs on ps.PLAYER_ID = pcs.PLAYER_ID
                                        and ps.POSITION_CODE = pcs.POSITION_CODE
                                        and ps.STATUS_CODE = pcs.STATUS_CODE
group by ps.STRATEGY_ID
having count(ps.PLAYER_ID) = (select count(*) from @PlayerComboStrategy)
    and count(ps.PLAYER_ID) = (select count(*) from @PlayerStrategy ps2 where ps2.STRATEGY_ID = ps.STRATEGY_ID)

如果您将表结构作为ddl而不是映像提供,那么其他人将更容易做到这一点。还有表变量的结构和它的一些示例数据。有一个问题……你说如果战略不存在,你想创建它。我很确定我知道这意味着什么,但是如果有一个不存在的玩家呢?您的表变量中似乎没有该名称。创建新策略也有同样的问题……你没有名字。@SeanLange,我添加了一些示例数据来帮助你。至于您的问题,如果播放机不存在,则在创建表变量之前在存储过程中创建它。