同一个表的所有记录由一个字段相关但由另一个字段查询 - sqlserver

Posted

技术标签:

【中文标题】同一个表的所有记录由一个字段相关但由另一个字段查询 - sqlserver【英文标题】:All records of the same table reladed by a field but queried by anothe field - sqlserver 【发布时间】:2019-06-14 15:02:49 【问题描述】:

数据库:SQLSERVER 我有这张桌子:

id-description-code
1 -fdsdfsf     -A
2 -ghggh       -A
3 -tytytyty    -B
4 -hjhjydx     -A

我需要一个查询“过滤一个 id”(例如“2”)返回我通过“代码”关联的同一张表的所有记录

查找 id=2 结果应该是:

1 -fdsdfsf     -A
2 -ghggh       -A
4 -hjhjydx     -A

我写了这两个有效的查询:

SELECT * FROM TABLE S2 INNER JOIN
(select * from TABLE 
  WHERE ID=2) S1
  ON S1.CODE=S2.CODE


SELECT * FROM TABLE S2
WHERE S2.CODE IN (SELECT CODE FROM  TABLE S1 WHERE  ID =2)

您能否给我其他查询示例(使用不同的运算符,例如 CROSS APPLY、EXIST 或其他)以获得相同的结果

【问题讨论】:

你的例子有什么问题?您使用CROSS APPLYEXIST 和“其他”做了哪些尝试;为什么他们不工作? 【参考方案1】:

这似乎是一个奇怪的请求,只是寻找返回相同信息的可能方式。但是您似乎跳过了最简单的方法。请注意我是如何发布消耗性数据以便其他人可以编写查询的?你以后应该这样做。

declare @Something table
(
    ID int
    , description varchar(20)
    , CODE char(1)
)

insert @Something values
(1, 'fdsdfsf', 'A')
,(2, 'ghggh', 'A')
,(3, 'tytytyty', 'B')
,(4, 'hjhjydx', 'A')


select *
from @Something s
join @Something s2 on s2.CODE = s.CODE
where s.ID = 2

或使用交叉应用

select *
from @Something s
cross apply (select * from @Something s2 where s2.CODE = s.CODE) x
where s.ID = 2

【讨论】:

这个答案有我需要的一切。感谢您建议使用此方法为下一个示例公开数据。 在内部交叉应用查询中放置“where”条件或插入“and s.ID = 2”有什么性能考虑? “性能考虑”是什么意思?我无法用如此笼统的东西回答其中的含义。如果您想知道,我建议您尝试两种方式并比较执行计划。另外,不要害怕race your horses。【参考方案2】:

为什么让它变得比它需要的更复杂?

select * from sometable where code = 
(select code from sometable where id=2)

【讨论】:

这是为了我的教学目的,我想找出所有可能的方法,而不关心性能和复杂性。我需要锻炼这些运算符 那么这里有无限可能。 请给我一些! 这不是免费的代码编写服务。我可以花几个星期写出各种奇怪的方法来做到这一点。但是为了什么目的?所以你可以看到一堆愚蠢的复杂方法来做一些超级简单的事情?

以上是关于同一个表的所有记录由一个字段相关但由另一个字段查询 - sqlserver的主要内容,如果未能解决你的问题,请参考以下文章

数据库表关系相关案例

跨具有可能不存在的相关记录的多个表的访问查询

如何查询一个oracle数据库中所有表的所有字段哪个包含特定字符串?

我应该如何使用 Spring Data MongoDB 计算由另一个分组的字段的总和

聚合查询中由另一个字段分组的两个 int 数组的总和

在oracle中如何查询一张表的所有数据结构,包括字段,视图,索引,约束