TSQL:获取给定ID的所有行

时间:2009-08-12 10:40:55

标签: sql-server tsql

我正在尝试将所有数据库报告输出到一个报告中。我目前正在使用嵌套的select语句来获取每个ID的每一行(ID的数量是未知的)。现在我想在一个查询中返回每个ID的所有行(例如,如果有25行,则返回1-25行)。我该怎么做?

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

这将返回主域和子域的结果排名,以及posts表的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循环,然后选择它们并删除表来解决问题。我会稍微公开一下,看看有没有人找到一个更好的方法,因为我讨厌这样做。

5 个答案:

答案 0 :(得分:1)

如果您需要在其自己的列上显示每个报告ID,请查看PIVOT/UNPIVOT命令。

答案 1 :(得分:1)

这是一种方法:

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%'

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

看看这是不是你正在寻找

选择       例如,在reports.id = 1 THEN reports.Name            ELSE“”作为Col1,       例如,在reports.id = 2 THEN reports.Name            ELSE“”作为Col2 .... FROM报告

最诚挚的问候, 约尔丹

答案 4 :(得分:0)

假设您有一个“主”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

再次,根据报告的相似性,您可能会在某些方面将这些结合起来。