SQL Server-选择每个组合

SQL Server-选择每个组合,sql,sql-server,tsql,Sql,Sql Server,Tsql,下面有两个表,我试图编写一个查询,为团队中的每个人选择每一次购买。例如,它应该显示与PurchaseID1和PurchaseID2关联的角色,因为它们与TeamA在同一个团队中 这可能吗?我原以为交叉连接会起作用,但它似乎带回了太多的列。我正在运行SQL Server 多谢各位 购买 | PurchaseID | PersonID | |------------ |---------- | | 1 | TeamA | | 2 |

下面有两个表,我试图编写一个查询,为团队中的每个人选择每一次购买。例如,它应该显示与PurchaseID1和PurchaseID2关联的角色,因为它们与TeamA在同一个团队中

这可能吗?我原以为交叉连接会起作用,但它似乎带回了太多的列。我正在运行SQL Server

多谢各位

购买

| PurchaseID    | PersonID  |
|------------   |---------- |
| 1             | TeamA     |
| 2             | TeamA     |
| 3             | PersonA   |
| 4             | PersonB   |
| 5             | TeamB     |
团队

预期结果(在PurchaseID 1上筛选时):


你的数据结构有点奇怪,但我想我明白你想要什么

如果PersonA进行了购买,并且PersonA在TeamA上,那么TeamA上的每个人都应该显示为与购买关联,对吗?比如“我为我的团队买了这些甜甜圈,所以团队中的每个人都会得到一个甜甜圈”

正如您可能猜到的,您想要的是在PersonID上加入购买团队。但是,然后使用一个交叉应用函数(在内联表值函数中)返回与“当前行”中的人员在同一团队中的所有人员

我使用了两个常用的表表达式来表示您的表,以便运行它。您只需要选择零件:

with Purchases as (
      select 1 as PurchaseID, 'TeamA'   as PersonID
union select 2 as PurchaseID, 'TeamA'   as PersonID
union select 3 as PurchaseID, 'PersonA' as PersonID
union select 4 as PurchaseID, 'PersonB' as PersonID
union select 5 as PurchaseID, 'TeamB'   as PersonID
)
, Teams as (
      select 1 as TeamID, 'PersonA' as PersonID
union select 1 as TeamID, 'TeamA'   as PersonID
union select 1 as TeamID, 'PersonC' as PersonID
union select 2 as TeamID, 'PersonB' as PersonID
union select 2 as TeamID, 'TeamB'   as PersonID
)
select Purchases.PurchaseID
     , EveryTeamMember.PersonID
  from Purchases
  join Teams
    on Teams.PersonID = Purchases.PersonID
cross apply (
             select PersonID
               from Teams InnerTable
              where InnerTable.TeamID = Teams.TeamID
            ) as EveryTeamMember
where Purchases.PurchaseID = 1

你的数据结构有点奇怪,但我想我明白你想要什么

如果PersonA进行了购买,并且PersonA在TeamA上,那么TeamA上的每个人都应该显示为与购买关联,对吗?比如“我为我的团队买了这些甜甜圈,所以团队中的每个人都会得到一个甜甜圈”

正如您可能猜到的,您想要的是在PersonID上加入购买团队。但是,然后使用一个交叉应用函数(在内联表值函数中)返回与“当前行”中的人员在同一团队中的所有人员

我使用了两个常用的表表达式来表示您的表,以便运行它。您只需要选择零件:

with Purchases as (
      select 1 as PurchaseID, 'TeamA'   as PersonID
union select 2 as PurchaseID, 'TeamA'   as PersonID
union select 3 as PurchaseID, 'PersonA' as PersonID
union select 4 as PurchaseID, 'PersonB' as PersonID
union select 5 as PurchaseID, 'TeamB'   as PersonID
)
, Teams as (
      select 1 as TeamID, 'PersonA' as PersonID
union select 1 as TeamID, 'TeamA'   as PersonID
union select 1 as TeamID, 'PersonC' as PersonID
union select 2 as TeamID, 'PersonB' as PersonID
union select 2 as TeamID, 'TeamB'   as PersonID
)
select Purchases.PurchaseID
     , EveryTeamMember.PersonID
  from Purchases
  join Teams
    on Teams.PersonID = Purchases.PersonID
cross apply (
             select PersonID
               from Teams InnerTable
              where InnerTable.TeamID = Teams.TeamID
            ) as EveryTeamMember
where Purchases.PurchaseID = 1

如果您希望在PersonID以
Team
开头时获取所有团队人员,那么我认为您应该对以
Team
开头的所有PersonID和UNION(非UNION all)单人购买进行交叉应用:

DECLARE @Purchases TABLE (
    PurchaseID INT,
    PersonID Varchar(50)
)
INSERT INTO @Purchases(PersonID,PurchaseID) VALUES ('TeamA', 1);
INSERT INTO @Purchases(PersonID,PurchaseID) VALUES ('TeamA', 2);
INSERT INTO @Purchases(PersonID,PurchaseID) VALUES ('PersonA', 3);
INSERT INTO @Purchases(PersonID,PurchaseID) VALUES ('PersonB', 4);
INSERT INTO @Purchases(PersonID,PurchaseID) VALUES ('TeamB', 5);



DECLARE @Teams TABLE (
    TeamID INT,
    PersonID Varchar(50)
)
INSERT INTO @Teams(PersonID,TeamID) VALUES ('PersonA', 1);
INSERT INTO @Teams(PersonID,TeamID) VALUES ('TeamA', 1);
INSERT INTO @Teams(PersonID,TeamID) VALUES ('PersonC', 1);
INSERT INTO @Teams(PersonID,TeamID) VALUES ('PersonB', 2);
INSERT INTO @Teams(PersonID,TeamID) VALUES ('TeamB', 2);


SELECT T1.PurchaseID,TeamPersons.PersonID
FROM @Purchases T1
INNER JOIN @Teams T2
ON T2.PersonID = T1.PersonID AND T1.PersonID LIKE'Team%'
CROSS APPLY (
             SELECT PersonID
               FROM @Teams T3
              WHERE T3.TeamID = T2.TeamID
            ) AS TeamPersons

UNION 

SELECT T1.PurchaseID
     , T1.PersonID
  FROM @Purchases T1
WHERE T1.PersonID NOT LIKE 'Team%'
结果


如果您希望在PersonID以
团队开始时获得所有团队人员,那么我认为您应该对以
团队开始的所有PersonID和UNION(而非UNION all)单人购买进行交叉应用:

DECLARE @Purchases TABLE (
    PurchaseID INT,
    PersonID Varchar(50)
)
INSERT INTO @Purchases(PersonID,PurchaseID) VALUES ('TeamA', 1);
INSERT INTO @Purchases(PersonID,PurchaseID) VALUES ('TeamA', 2);
INSERT INTO @Purchases(PersonID,PurchaseID) VALUES ('PersonA', 3);
INSERT INTO @Purchases(PersonID,PurchaseID) VALUES ('PersonB', 4);
INSERT INTO @Purchases(PersonID,PurchaseID) VALUES ('TeamB', 5);



DECLARE @Teams TABLE (
    TeamID INT,
    PersonID Varchar(50)
)
INSERT INTO @Teams(PersonID,TeamID) VALUES ('PersonA', 1);
INSERT INTO @Teams(PersonID,TeamID) VALUES ('TeamA', 1);
INSERT INTO @Teams(PersonID,TeamID) VALUES ('PersonC', 1);
INSERT INTO @Teams(PersonID,TeamID) VALUES ('PersonB', 2);
INSERT INTO @Teams(PersonID,TeamID) VALUES ('TeamB', 2);


SELECT T1.PurchaseID,TeamPersons.PersonID
FROM @Purchases T1
INNER JOIN @Teams T2
ON T2.PersonID = T1.PersonID AND T1.PersonID LIKE'Team%'
CROSS APPLY (
             SELECT PersonID
               FROM @Teams T3
              WHERE T3.TeamID = T2.TeamID
            ) AS TeamPersons

UNION 

SELECT T1.PurchaseID
     , T1.PersonID
  FROM @Purchases T1
WHERE T1.PersonID NOT LIKE 'Team%'
结果


那么您的预期结果是什么?为什么
交叉连接
返回的列太多?来自
控件没有返回许多列,这就是
选择
。请务必包括您的尝试。交叉连接,并且不要在
SELECT
中使用星号,请使用列选择细化我不明白为什么
交叉连接在这里不起作用。请发布您的SQL。那么您预期的结果是什么?为什么
交叉连接
返回的列太多?来自
控件没有返回许多列,这就是
选择
。请务必包括您的尝试。交叉连接,并且不要在
SELECT
中使用星号,请使用列选择细化我不明白为什么
交叉连接在这里不起作用。请发布您的SQL。