我试图在与这些ID绑定的任何一行中满足条件的特定ID返回所有行。请原谅我是SQL的新手......示例如下:
ID * Line *#*
12 * 1 * A *
除了我的select和condition =(X,Y或Z)之外,不确定代码是什么:
ID * Line *#*
12 * 1 * A *< - 不包括X,Y或Z但是ID的一部分
我想要在不符合条件的情况下提取所有行记录,只要它们是具有符合条件的行的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个表。我认为这只会使我对子查询的理解复杂化,而不是因为子查询受到影响。
感谢大家的帮助和答案到目前为止!
答案 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