Sql server SQL Server:can';找不到合适的';加入';我想要的公式
我正试图找到实现这一目标的正确方法。假设我有3张表A、B和C 我希望我的请求显示所有3个表中的一些信息,但我只希望按A中的记录显示一行 如果我连接表,问题是大多数时候有很多B记录链接到一个a记录,更糟糕的是,有很多C链接到一个B,所以有时候,同一个a记录会显示上百次 我尝试了Sql server SQL Server:can';找不到合适的';加入';我想要的公式,sql-server,join,Sql Server,Join,我正试图找到实现这一目标的正确方法。假设我有3张表A、B和C 我希望我的请求显示所有3个表中的一些信息,但我只希望按A中的记录显示一行 如果我连接表,问题是大多数时候有很多B记录链接到一个a记录,更糟糕的是,有很多C链接到一个B,所以有时候,同一个a记录会显示上百次 我尝试了为B选择top(1),为C再次选择top(1),但它仍然返回top(1)写入同一A的每100行,尝试了左连接。。。内部连接 我试图找出如何分组,但仍然找不到正确的分组。最后我做了很多嵌套选择,事实上,我的查询包含的嵌套选择比
为B选择top(1)
,为C再次选择top(1)
,但它仍然返回top(1)
写入同一A的每100行,尝试了左连接。。。内部连接
我试图找出如何分组,但仍然找不到正确的分组。最后我做了很多嵌套选择,事实上,我的查询包含的嵌套选择比其他任何东西都多。。。这是可行的,但需要永远
Select * FROM A
OUTER APPLY (Select TOP 1 * FROM B Where A.colX = B.ColY) as New_B
OUTER APPLY (Select TOP 1 * FROM C Where A.colX = C.ColY) as New_C
您可能需要修改New_B和New_C Select语句以符合您的要求。尝试以下操作:
Select * FROM A
OUTER APPLY (Select TOP 1 * FROM B Where A.colX = B.ColY) as New_B
OUTER APPLY (Select TOP 1 * FROM C Where A.colX = C.ColY) as New_C
您可能需要修改New_B和New_C Select语句以符合您的要求。您可以将公共表表达式(cte)与
行编号一起使用。像这样的
;with cte as (
select a.id,b.name,c.price,
row_number() over(partition by a.id order by b.name, c.price) rn
from a inner join b on a.id = b.a_id
inner join c on b.id = c.b_id
)
select * from cte
where rn=1
您可以将公共表表达式(cte)与行号一起使用。像这样的
;with cte as (
select a.id,b.name,c.price,
row_number() over(partition by a.id order by b.name, c.price) rn
from a inner join b on a.id = b.a_id
inner join c on b.id = c.b_id
)
select * from cte
where rn=1
您可以使用EXISTS子句表示:-)您可以使用EXISTS子句表示:-)