2009-08-12 108 views
0

我試圖將所有數據庫報告輸出到一個報告中。我目前使用嵌套的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

回答

1

如果你需要對自己列的每個報告ID,看一看的PIVOT/UNPIVOT個命令。

0

這是一個查詢?你提供了你自己的答案?

如果你的意思是你想返回一系列'行',出於某種原因,'列',這個能力確實存在,但我不記得確切的名字。可能的關鍵。但有點奇怪。

+0

上面的查詢將返回一行,因爲每個「列」只有一個值。我想遍歷查詢並從每個可用的ID中增加ID,以便顯示許多行。 – 2009-08-12 10:51:01

0

看看這是你正在尋找

選擇 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

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

再次,取決於您的報告相似,你很可能合併這些在某種程度上。

+0

我試過第一個,它會輸出與報表中的行相同數量的行,但它只是重複第一行。 – 2009-08-12 11:38:35