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