SQL - 返回ID的所有行,其中一行符合条件A,B或C.

时间:2017-04-07 18:40:45

标签: sql sql-server teradata

我试图在与这些ID绑定的任何一行中满足条件的特定ID返回所有行。请原谅我是SQL的新手......示例如下:

  • ID * Line *#*

  • 12 * 1 * A *

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

除了我的select和condition =(X,Y或Z)之外,不确定代码是什么:

  • ID * Line *#*

  • 12 * 1 * A *< - 不包括X,Y或Z但是ID的一部分

  • 12 * 2 * B *< - 在该ID的另一行中有X
  • 12 * 3 * X *
  • 12 * 4 * Y *

我想要在不符合条件的情况下提取所有行记录,只要它们是具有符合条件的行的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

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

感谢大家的帮助和答案到目前为止!

2 个答案:

答案 0 :(得分:4)

您可以使用子查询和IN

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

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

答案 1 :(得分:1)

除了子查询方法,您还可以尝试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