【问题标题】:join same table twice sql server加入同一张表两次sql server
【发布时间】:2021-06-16 17:20:44
【问题描述】:

我有一个名为 Notes 的表格:

我想这样显示:

select n1.note_ecrit, n1.note_tp, n1.note_total, n2.note_ecrit, n2.note_tp, n2.note_total
from Notes n1
     inner join Notes n2 on n1.cne = n2.cne

【问题讨论】:

  • 请提供更多细节。
  • 好吧,我有 Table Note,如图 1,我不想在同一行而不是两行中获得第一个会话和第二个会话的注释
  • 请避免链接到图像并将您的示例添加为格式化文本,这样更容易提供帮助。
  • 好吧,我有 Table Note,如图 1,我不想在同一行而不是两行中获得第一个会话和第二个会话的注释
  • 你可以使用union-all。像这样:with t1 as (select n1.note_ecrit, n1.note_tp, n1.note_total, n2.note_ecrit, n2.note_tp, n2.note_total from Notes n1 inner join Notes n2 on n1.cne = n2.cne); select n1.* union all select n2.*,类似 tha。请阅读此链接:docs.microsoft.com/en-us/sql/t-sql/queries/…

标签: sql sql-server-2008


【解决方案1】:

你的问题不是很清楚,希望我理解正确。如果您在手动逐个列出列之后,最简单(远非最佳!)的解决方案是简单地使用嵌套查询:

SELECT n1.note_ecrit, n1.note_tp, n1.note_total, 
       (SELECT n2.note_ecrit FROM Notes n2 on n1.cne = n2.cne) as note_ecrit, 
       (SELECT n2.note_tp    FROM Notes n2 on n1.cne = n2.cne) as note_tp,
       (SELECT n2.note_total FROM Notes n2 on n1.cne = n2.cne) as note_total
FROM Notes n1

注意:您不必太担心性能,查询 3 个单独的列 3 次。在大多数情况下,SQL 服务器会以某种方式构造查询,即它只会在内部查询记录一次。但它没有被授予;当性能至关重要时,始终测试选项以获得最佳结果。

在某些情况下,更好的方法可能是使用 SQL 服务器的STRING_AGG 函数将值列出到一个结果字段中,这样的输出格式是可以接受的。

【讨论】:

  • 这不是真的,如果您在同一张表上有三个连接,那么将执行 3 个连接。这同样适用于诸如上述的相关子查询。我不知道优化器会将 separate 连接合并为一个(可以消除某些连接,但在选择列时不会在这里)。
  • 我觉得我无法反驳或证实你写的内容。过去我一直在用非常经典和保守的方法编写 SQL,但多年来我有一位承包商 SQL 专家多次拜访我,就处理大型数据集的庞大流程提供建议,他们告诉我不要担心这一点(并且其他一些)特定的事情并解释了原因。我基本上根据经验调整我的流程,如果我缺乏经验,我会反复试验。大多数情况下它都能正常工作。
  • ...最近,我什至有一个案例,ORDER BY CONCAT(LastName,' ',FirstName) 明显然后ORDER BY LastName。第一个短语已经在查询中使用,而那一列没有。最有可能使用执行计划来检查。不过,我不能使用它们。 ...但正如我所说,我不是在争论:-)。我认为它会对这个特定的 OP 造成问题的可能性有限地接近于零。
  • 它确实通常只是工作,优化器有很多很多技巧,例如连接交换和消除,连接和应用之间的转换,谓词下推。这不是其中的一个。但是您的代码可能仍然比聚合更高效,这取决于索引。你的ORDER BY 的例子很有趣,我很想看看它的执行计划。是否涉及持久计算列?我会对顾问“SQL 专家”持怀疑态度,他们似乎经常认为NOLOCK 是所有问题的答案。
  • 我修改了(早些时候)我的答案(以测试是否需要性能),希望避免误导人们,就您的 cmets 而言。确实,有一个计算列FullName,它应该这样做,但有人没有考虑太多并颠倒了顺序,使用 `CONCAT(FirstName,' ',LastName) istead,这几乎没用,无法正确订购。所以是的,有一个持久计算字段,但我不能使用它。至于专家 :-),他们对我帮助不大,但像这样的一些非常技术性的细节,在我的游戏之上,我谨慎地信任他们。
【解决方案2】:

你在正确的轨道上。只需包括 id_session 即可:

select n1.note_ecrit, n1.note_tp, n1.note_total, n2.note_ecrit, n2.note_tp, n2.note_total
from Notes n1 join
     Notes n2
     on n1.cne = n2.cne
where n1.id_session = 1 and
      n2.id_session = 2;

【讨论】:

  • 他得到了复制的数据
  • @bx1 。 . .不是基于问题中的样本数据。您的问题似乎与此处提出的问题不同。
猜你喜欢
  • 2016-04-05
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2018-07-21
  • 1970-01-01
  • 2014-03-17
相关资源
最近更新 更多