Sql server SQL Server:can';找不到合适的';加入';我想要的公式

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行,尝试了左连接。。。内部连接 我试图找出如何分组,但仍然找不到正确的分组。最后我做了很多嵌套选择,事实上,我的查询包含的嵌套选择比

我正试图找到实现这一目标的正确方法。假设我有3张表A、B和C

我希望我的请求显示所有3个表中的一些信息,但我只希望按A中的记录显示一行

如果我连接表,问题是大多数时候有很多B记录链接到一个a记录,更糟糕的是,有很多C链接到一个B,所以有时候,同一个a记录会显示上百次

我尝试了
为B选择top(1)
,为C再次选择
top(1)
,但它仍然返回
top(1)
写入同一A的每100行,尝试了左连接。。。内部连接

我试图找出如何分组,但仍然找不到正确的分组。最后我做了很多嵌套选择,事实上,我的查询包含的嵌套选择比其他任何东西都多。。。这是可行的,但需要永远

  • 如果我想办法删除大部分嵌套的select,会不会更快

  • 这可能吗?我的意思是,有人曾经成功地完成过这一行对所有“A”记录的查询吗

  • 试试这个:

    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子句表示:-)