2013-12-10 120 views
0

我有一个SQL查询返回基于where子句的结果。SQL Server:嵌套选择查询

我想包括一些更多的结果,从同一张表,取决于在第一次选择中找到什么。

我的选择返回ID符合where条件的行。它确实发生这个表有更多的行与这个ID,但不符合最初的标准。我不想用一个单独的调用重新查询数据库,我想使用一个select语句来获取具有相同ID的这些额外的行。 ID不是索引/ ID。它是我在这里使用的命名约定。

伪:(两步)

1: select * from table where condition=xxx 

2: for each row returned, (select * from table where id=row.id) 

我想做的事:

select 
    id as thisID, field1, field2, 
    (select id, field1, field2 from table where id = thisID) 
from 
    table 
where 
    condition=xxx 

我在我的实际查询多个连接,只是不能得到上述工作。我遗憾地无法提供真正的查询,但是我得到以下错误:

当子查询未与EXISTS一起引入时,只能在选择列表中指定一个表达式。无效的列名'thisID'

我的查询可以很好地处理多个连接,没有上述问题。我试图检索这些额外的记录作为当前工作查询的一部分。

实施例:

select * from table where col3 = 'green' 

id, col1, col2, col3 

123 | blue | red | green 
------------------------- 
567 | blue | red | green 
------------------------- 
123 | blue | red | blue 
------------------------- 
890 | blue | red | green 
------------------------- 

欲返回所有4行,因为虽然row 3失败where条件,它具有相同的col1row 1(123),并且我需要包含它,因为它是我需要定位/导入的“集合”的一部分,由id=123调用/引用。

我现在正在做的是获取第一行,然后运行另一个基于第一行ID的查询来获得第三行。

+0

...好吧,你能给我们提供样本数据布局吗?你是否有每行唯一的id(ids不必是唯一的?是否匹配的行也出现在子查询中?如果多行具有相同的键 - 它们应由子查询报告,但列出用不同的行(不同的唯一ID)?为获得最佳结果,请尽可能完整地查询查询(如果需要,请匿名) –

+0

Hi @ Clockwork-Muse,查询有5个连接,许多领域...我正在将一个旧系统的数据“导入”到我们正在开发的一个新系统中,我将添加更多的细节。目前,我已经提前完成并重新查询了每一个最初的行,因为我需要取得一些进展,但我希望能得到以上工作以供将来参考 –

+0

这很好,但除非您告诉我们您期望数据看起来像什么时候完成(关于复制的一般值),我们可以不明智地帮助你。哎呀,_你可能会对结果感到惊讶... –

回答

0

您可以使用Where IN

select id as thisID, field1, field2 from table 
where id in 
(select id from table where condition=xxx) 
+0

这看起来不符合OP想要的输出 - 他正在寻找显示每一行的匹配标准。 –

+0

我认为它确实..OP'似乎'想要所有属于'绿色'类别的所有ID的信息 – Schalk

0

试试这个

让说你下面的表格中,并呼吁#TEMP

Id Col1 Col2 Col3 
123 blue red  green 
567 blue red  green 
123 blue red  blue 
890 blue red  green 

将得到id到一个临时表

Create Table #T1(Id int) 
Insert Into #T1 
Select Id 
From #Temp 
Where Col3='green' 

然后

Select distinct * 
From #Temp 
Where Id in (select Id from #T1) Or Col3='Green' 

这导致所有从主表中的行

更新

如果你想使用您当前使用的方式,尝试喜欢的东西下面

select 
    id as thisID, field1, field2, 
    (select top 1 id from table where id = t.id) as Id, 
    (select top 1 field1 from table where id = t.id) as field1, 
    (select top 1 field2 from table where id = t.id) as field2, 
from 
    table t 
where 
    condition=xxx 
+0

如前所述,作为更大连接的一部分,我需要将它全部用于一个查询。我不认为临时表创建将在这里工作,因为这基本上是我现在手动在代码中做的。 –

+0

我将不得不为每个返回的原始记录创建一个临时表,以内联方式获取剩余的内容。此查询在数千条记录的表上运行。不知道这是甚至可能吗? –

+0

@LouisvanTonder:你不能选择多个列作为subqurey中的字段! –