【问题标题】:Single query to return one to many by a search on the many单个查询通过对多的搜索返回一对多
【发布时间】:2019-09-17 20:58:36
【问题描述】:

我有一张这样的桌子

Table1Id | Column2
-------------------
100      | somedata

还有一个这样的

Table2Id|Table1Id|Name  |Value
-------------------------------
500     |100     |name1 |value1
501     |100     |name2 |value2

我有“name1”和“value1”可供搜索,我想用它从 table1 中检索所有内容。这很容易,但是当我只从第一行获取数据时,如何检索 table2 中的其余子项?我想在一个查询中完成,我想避免子查询,但不确定这是否可能。

有人可以修复此查询以返回 table2 中的另一个子行吗?

SELECT *
FROM Table1 t1
JOIN table2 t2 on t1.Table1Id = t2.Table1Id
WHERE t2.Name = 'name1' AND t2.Value = 'value1'

【问题讨论】:

  • 你提到 "the other child row in table2" 但不要在你的问题中显示它...如果你想要两个表中的所有记录,请尝试FULL OUTER JOIN
  • @dvo 另一个孩子在第二个表中。由于 Where 的原因,完整的外部联接将不起作用。

标签: sql-server database tsql


【解决方案1】:
select T1.*, T2.*
FROM Table1 T1
INNER JOIN Table2 T2 on T1.Table1Id = T2.Table1Id
INNER JOIN Table2 Query on T1.id= Query.Table1Id
WHERE Query.[Name] = 'name1' AND Query.[Value] = 'value1'

请注意,如果有超过 1 个 Table2 行具有相同的 NameValue 组合,这不会引发错误。

【讨论】:

  • 在这种情况下,您可能希望select T1.*, T2.* 避免重复 Table2 的列。
  • 不幸的是,虽然是一个完全有效的解决方案,但在没有任何索引的情况下,我的查询性能是你的两倍 :)
  • 是的,我完全忘记了。编辑:D 我只是提供了一个避免子查询的替代解决方案。也许名称和值的组合不是唯一的,这将受益于索引。在没有任何索引的情况下,我可能会建议添加它们,因为这些表似乎有明确的关系:)
【解决方案2】:

不确定为什么要在这种情况下避免子查询,例如子查询可提供最佳性能

declare @Table1 table (Table1Id int, Column2 varchar(32));
declare @Table2 table (Table2Id int, Table1Id int, [Name] varchar(32), [Value] varchar(32));

insert into @Table1 (Table1Id, Column2)
  select 100, 'somevalue1' union all
  select 101, 'somevalue2'

insert into @Table2 (Table2Id, Table1Id, [Name], [Value])
  select 500, 100, 'name1', 'value1' union all
  select 501, 100, 'name2', 'value2' union all
  select 502, 101, 'name3', 'value3' union all
  select 503, 101, 'name4', 'value4'

SELECT *
FROM @Table1 T1
INNER JOIN @Table2 T2 on T1.Table1Id = T2.Table1Id
WHERE T1.Table1Id = (
  SELECT T2A.Table1Id
  FROM @Table2 T2A
  WHERE T2A.[Name] = 'name1' AND T2A.[Value] = 'value1'
)

给予:

Table1Id    Column2     Table2Id    Table1Id    Name    Value
100         somevalue1  500         100         name1   value1
100         somevalue1  501         100         name2   value2

【讨论】:

  • 试图避免子查询怎么办?它们是任何 T-SQL 工具箱的主要部分。
  • 我只是好奇我能不能做到。我会接受你的回答,但我有一个关于 value,name 的聚集索引
【解决方案3】:

也许这就是您正在寻找的,但完全不确定:

select *
from Table2 t2
left join Table1 t1 on t1.Table1Id = t2.Table1Id
and t2.Name = 'name1' and t2.Value = 'value1'

【讨论】:

    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2013-07-13
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多