TSQL:获取给定ID的所有行

问题描述:

我试图将所有数据库报告输出到一个报告中。我目前使用嵌套的select语句来获取每个ID的每一行(ID的数量未知)。现在我想在一个查询中返回每个ID的所有行(例如,如果有25行,则为1-25)。我将如何做到这一点?TSQL:获取给定ID的所有行

SELECT (
    (SELECT ... FROM ... WHERE id = x) As Col1 
    (SELECT ... FROM ... WHERE id = x) As Col2 
    (SELECT ... FROM ... WHERE id = x) As Col3 
) 

编辑:下面是一个例子:

SELECT 
(select post_id from posts where report_id = 1) As ID, 
(select isnull(rank, 0) from results where report_id = 1 and url like '%www.testsite.com%') As Main, 
(select isnull(rank, 0) from results where report_id = 1 and url like '%.testsite%' and url not like '%www.testsite%') As Sub 

这将返回结果的排名主域和子域,以及有关的职位表中的ID 。

ID   Main   Sub 
-------------------------------------- 
1   5    0 

我想通过这个查询循环,改变REPORT_ID到2,然后是3,然后4和,直到所有的结果都显示矣。除了report_id之外,其他任何内容都不需要改变。


这里是什么表

POSTS 
post_id  post      report_id 
--------------------------------------------------------- 
1    "Hello, I am..."   1 
2    "This may take..."   2 
3   "Bla..."     2 
4   "Bla..."     3 
5   "Bla..."   4 

RESULTS 
result_id url    title   report_id 
-------------------------------------------------------- 
1   http://... "Intro"  1  
2   http://...  "Hello!"  1 
3   http://... "Question"  2 
4   http://...  "Help"   3 

REPORTS 
report_id description 
--------------------------------- 
1   Introductions 
2   Q&A 
3   Starting Questions 
4   Beginner Guides 
5   Lectures 

查询将要拉后的第一个,从主要网站的第一个结果(WWW),并从第一个结果里面一个基本的例子子域由他们的report_id。这些表是包含许多其他表的复杂连接结构的一部分,但为了这些目的,这些表是唯一需要的表。


我已经成功通过创建一个表,设置变量采取的所有内容,并在while循环插入它们,然后选择他们删除表来解决这个问题。我会稍微留意一下,看看有没有人拿起更好的方式来做这件事,因为我讨厌这样做。

+0

是每个子表从不同的表中选择? – 2009-08-12 10:46:02

+0

其中一些是,但他们都在where子句中使用相同的ID。 – 2009-08-12 10:46:57

+0

您可以添加一个您的表格样式的示例,以及您想要作为查询输出的示例吗? – Blorgbeard 2009-08-12 10:47:36

如果你需要对自己列的每个报告ID,看一看的PIVOT/UNPIVOT个命令。

这是一个查询?你提供了你自己的答案?

如果你的意思是你想返回一系列'行',出于某种原因,'列',这个能力确实存在,但我不记得确切的名字。可能的关键。但有点奇怪。

+0

上面的查询将返回一行,因为每个“列”只有一个值。我想遍历查询并从每个可用的ID中增加ID,以便显示许多行。 – 2009-08-12 10:51:01

看看这是你正在寻找

选择 CASE WHEN reports.id什么= 1,则reports.Name ELSE “” AS Col1中, CASE WHEN reports.id = 2,则reports.Name ELSE “” AS col2的 .... 从报告中

最好的问候, 约尔丹

+0

如果我有几百个ID,那可能会变得很长。 – 2009-08-12 10:50:18

下面是做这件事的一种方法:

SELECT posts.post_id AS ID, 
IsNull(tblMain.Rank, 0) AS Main, 
IsNull(tblSub.Rank, 0) AS Sub 
FROM posts 
LEFT JOIN results AS tblMain ON posts.post_id = tblMain.report_id AND tblMain.url like '%www.testsite.com%' 
LEFT JOIN results AS tblSub ON posts.post_id = tblSub.report_id AND tblSub.url like '%.testsite%' and tblSub.url not like '%www.testsite%' 

假设你有ID的“主表”(如果没有,我建议你为外键的目的这样做):

SELECT (
    (SELECT ... FROM ... WHERE id = m.ID) As Col1 
    (SELECT ... FROM ... WHERE id = m.ID) As Col2 
    (SELECT ... FROM ... WHERE id = m.ID) As Col3 
) 
FROM MasterIDs m 

根据每个报告的类似程度,您可以通过将某些逻辑移出嵌套语句并加入查询的主体来加快速度。

可能想着这更好的办法是改变每个报告语句返回(ID,值),并做一些事情,如:

SELECT 
    report1.Id 
    ,report1.Value AS Col1 
    ,report2.Value AS Col2 
FROM (SELECT Id, ... AS Value FROM ...) report1 
JOIN (SELECT Id, ... AS Value FROM ...) report2 ON report1.Id = report2.Id 

再次,取决于您的报告相似,你很可能合并这些在某种程度上。

+0

我试过第一个,它会输出与报表中的行相同数量的行,但它只是重复第一行。 – 2009-08-12 11:38:35