Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 编写查询以基于组中的项目获取组中的所有记录_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 编写查询以基于组中的项目获取组中的所有记录

Sql 编写查询以基于组中的项目获取组中的所有记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,很抱歉这个没有用的标题,但希望我能解释得足够好 假设我有三张桌子 Item ItemKey ItemName Group GroupKey GroupItem GroupKey ItemKey 给定ItemKey,如何从item表中获取属于包含item key的组的所有记录 所以如果我有 Item 1 ItemA 2 ItemB 3 ItemC Group 1 2 3 GroupItem 1 1

很抱歉这个没有用的标题,但希望我能解释得足够好

假设我有三张桌子

Item
  ItemKey
  ItemName

Group
  GroupKey

GroupItem
  GroupKey
  ItemKey
给定ItemKey,如何从item表中获取属于包含item key的组的所有记录

所以如果我有

Item
   1    ItemA
   2    ItemB
   3    ItemC

Group
   1
   2
   3

GroupItem
   1     1
   1     2
   2     1
   2     2
   3     2
   3     3
传入1将返回ItemA和ItemB,但不会返回ItemC,因为其中没有同时包含ItemA和ItemC的组

select distinct ItemName
from Item I
inner join GroupItem GI
    on I.ItemKey = GI.ItemKey
where GI.GroupKey in
    (select GroupKey
    from GroupItem
    where ItemKey = @Param)
-- @Param is the input parameter. Change for you
-- DBMS
或:

或:


您可以使用子查询

SELECT DISTINCT i.ItemName
FROM GroupItem gi JOIN
  Item i ON gi.ItemKey = i.ItemKey
WHERE gi.GroupKey IN (
  SELECT DISTINCT GroupKey FROM GroupItem WHERE ItemKey = @Param
)

您可以使用子查询

SELECT DISTINCT i.ItemName
FROM GroupItem gi JOIN
  Item i ON gi.ItemKey = i.ItemKey
WHERE gi.GroupKey IN (
  SELECT DISTINCT GroupKey FROM GroupItem WHERE ItemKey = @Param
)

如果你通过了2,你会得到ItemA,ItemB和ItemC,因为它们都在ItemB的组中?我理解正确吗?如果你通过了2,你会得到ItemA、ItemB和ItemC,因为它们都在ItemB的组中?我理解正确吗?很好,谢谢。但是,选择一种查询是否有性能优势?1)在比较备选查询的性能时,请查看实际数据上的执行计划。2) 在过去,连接通常比子查询发生得更快,但是查询优化器已经足够好了,通常会选择相同的执行计划。然后是可读性。非常好,谢谢。但是,选择一种查询是否有性能优势?1)在比较备选查询的性能时,请查看实际数据上的执行计划。2) 在过去,连接通常比子查询发生得更快,但是查询优化器已经足够好了,通常会选择相同的执行计划。然后是可读性。