SQL - Return ID 的所有行,其中一行满足条件 A、B 或 C
SQL - Return all rows for ID where one row meets condition A,B,or C
我正在尝试 return 特定 ID 的所有行,其中在与这些 ID 相关的任何一行中满足条件。请原谅我是 SQL 的新手... 下面的示例:
ID * 行 * # *
12 * 1 * A *
- 12 * 2 * B *
- 12 * 3 * X *
- 12 * 4 * Y *
- 15 * 1 * A *
- 15 * 2 * B *
- 15 * 3 * C *
不确定除了我的 select 和条件 = (X, Y, or Z) to return:
之外的代码是什么
ID * 行 * # *
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
我几乎觉得我需要使用我的条件 IN('X','Y','Z') 创建 ID 和 LINE 的临时 table 然后内部加入所有 LINE(s) 的 ID,而不是 X、Y、Z。我认为这可能有效,但我还没有学会如何使用 temp tables。我有点麻烦,因为我正在使用一个查询,我在这里简化了很多,其中我 selecting 18 个字段加入其他 7 个 tables。我认为这只是使我对子查询的理解复杂化,而不是受其影响的子查询。
感谢大家迄今为止的帮助和回答!
您可以为此使用子查询和 IN
。
Select *
From YourTable
where ID in (select ID from YourTable where # in ('X','Y','Z'))
请注意,您的数据中没有 12 * 4 * C *
,但我认为这只是结果中的类型 o,应该是 12 * 4 * Y *
除了子查询方法之外,您还可以尝试使用 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 服务器中你必须使用 Derived Table/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
我正在尝试 return 特定 ID 的所有行,其中在与这些 ID 相关的任何一行中满足条件。请原谅我是 SQL 的新手... 下面的示例:
ID * 行 * # *
12 * 1 * A *
- 12 * 2 * B *
- 12 * 3 * X *
- 12 * 4 * Y *
- 15 * 1 * A *
- 15 * 2 * B *
- 15 * 3 * C *
不确定除了我的 select 和条件 = (X, Y, or Z) to return:
之外的代码是什么ID * 行 * # *
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
我几乎觉得我需要使用我的条件 IN('X','Y','Z') 创建 ID 和 LINE 的临时 table 然后内部加入所有 LINE(s) 的 ID,而不是 X、Y、Z。我认为这可能有效,但我还没有学会如何使用 temp tables。我有点麻烦,因为我正在使用一个查询,我在这里简化了很多,其中我 selecting 18 个字段加入其他 7 个 tables。我认为这只是使我对子查询的理解复杂化,而不是受其影响的子查询。
感谢大家迄今为止的帮助和回答!
您可以为此使用子查询和 IN
。
Select *
From YourTable
where ID in (select ID from YourTable where # in ('X','Y','Z'))
请注意,您的数据中没有 12 * 4 * C *
,但我认为这只是结果中的类型 o,应该是 12 * 4 * Y *
除了子查询方法之外,您还可以尝试使用 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 服务器中你必须使用 Derived Table/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