【问题标题】:SQL - Return all rows for ID where one row meets condition A,B,or CSQL - 返回其中一行满足条件 A、B 或 C 的 ID 的所有行
【发布时间】:2017-09-03 05:57:24
【问题描述】:

我正在尝试返回特定 ID 的所有行,其中与这些 ID 关联的任何行都满足条件。请原谅我是 SQL 的新手……示例如下:


  • ID * 行 * # *


  • 12 * 1 * A *

  • 12 * 2 * B *
  • 12 * 3 * X *
  • 12 * 4 * 是 *
  • 15 * 1 * A *
  • 15 * 2 * B *
  • 15 * 3 * C *

除了我的选择和条件 = (X、Y 或 Z) 之外,不确定要返回的代码是什么:


  • ID * 行 * # *


  • 12 * 1 * A *

  • 12 * 2 * B *
  • 12 * 3 * X *
  • 12 * 4 * 是 *

我想提取所有行记录,尽管它们不满足条件,只要它们是具有满足条件的行的 ID 的一部分。

感谢您的帮助!

* 编辑:包括尝试的代码*

SELECT ID
,LINE 
,#
    WHERE   ID,
IN (
SELECT ID
WHERE # IN ('X','Y','Z'))

结果:

ID  LINE  #
12   3    X
12   4    Y

我需要什么:

ID  LINE  #
12   1    A
12   2    B
12   3    X
12   4    Y

我几乎觉得我需要使用我的 IN('X','Y','Z') 条件创建一个 ID 和 LINE 临时表,然后在 ID 上为所有 LINE(s) 而不是 X ,Y,Z。我认为这可能有效,但我还没有学会如何使用临时表。我有点麻烦,因为我正在使用一个查询,在这里我已经简化了很多,我在这里选择了 18 个字段,这些字段加入了 7 个其他表。我认为这只是使我对子查询的理解复杂化,而不是受其影响的子查询。

感谢大家迄今为止的帮助和解答!

【问题讨论】:

  • 是三列还是一列?
  • 使用子查询来识别 ID,然后使用带有 ID IN 的子查询返回实际行
  • scsimon 的代码在正确使用时应该可以工作。你试过我的 OLAP 方法了吗?
  • 我是否应该在加入之前将该代码包含在我的所有选择语句中?我的查询结构为 SELECT(17 个字段)、FROM、JOIN(许多连接)、WHERE - 这是我拥有上述代码和其他条件的地方。
  • 是的,就是这样,只需将 MAX(CASE) 添加到您现有的 Select 中

标签: sql sql-server teradata


【解决方案1】:

您可以为此使用子查询和IN

Select *
From YourTable
where ID in (select ID from YourTable where # in ('X','Y','Z'))

请注意,您的数据中没有12 * 4 * C *,但我认为它只是您的结果中的一种类型,应该是12 * 4 * Y *

【讨论】:

  • 感谢您的回答。我确信这是在正确的轨道上。我试过这个,但不幸的是我有 7 个表加入以返回我需要的不同字段,但我无法让它工作。我不确定这是否是原因,但可能是。我的每个 ID 都绑定了许多 LINE,每个 LINE 都有一个 #。当我使用它时,我仍然只返回我在我的条件(X,Y,Z)中输入的#。我通过选择没有条件的特定 ID 进行了测试,它返回了更多没有(X、Y、Z)的 LINE。我将继续尝试子查询方法。
  • @CGermain 在与您的示例数据相关的原始问题中发布您的代码。
【解决方案2】:

除了子查询方法之外,您还可以尝试使用 OLAP 函数(当然,这可能会更好或更糟)

在 Teradata 中,您可以申请 QUALIFY:

Select *
From YourTable
qualify -- check if any row with the same ID has X/Y/Z
   max(case when ID in ('X','Y','Z') then 1 else 0 end)
   over (partition by ID) = 1

在 SQL Server 中,您必须使用派生表/CTE:

Select *
From 
 ( Select *,
      max(case when ID in ('X','Y','Z') then 1 else 0 end)
      over (partition by ID) as flag
   from YourTable
 ) as dt
where flag = 1

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    相关资源
    最近更新 更多