2014-01-22 224 views
0

可以說,這裏是我的數據庫結構SQL - 多個查詢或一個連接

TableA 
{ 
    [ID] INT IDENTITY (1, 1) primary key, 
    [Title] varchar (50) NOT NULL, 
    [Details] varchar(50) NOT NULL 
} 

TableB: 
{ 
    [ID] INT foreign key references [TableA] ([ID]) 
    [AvailableTime] DATETIME NOT NULL 
} 

TableC: 
{ 
[ID] INT foreign key references [TableA] ([ID]) 
[AvailableLocation] varchar(50) NOT NULL 
} 

我需要所有從表A柱以及特定ID

從表B AvailableTimes列表結果應該如下所示:新對象(id,title,details,List availableTime);

一個ID可能有多個可用時間。性能明智和速度明智的會更好,如果我做兩個單獨的查詢來檢索這些信息或做一個連接,然後循環通過列表兩次。 I.E.

select * from TableA where ID = 1; 
select * from TableB where ID = 1; 
select * from TableC where ID = 1; 

...

OR

select * from TableA inner join TableB on TableA.ID = TableB.ID inner join TableC on TableA.ID = TableC.ID where ID = 1 
List<DateTime> availableTime = new List<DateTime>(); 
foreach(DataRow row in resultTable.Rows) 
{ 
    if (!availableTime.Contains((DateTime) row["AvailableTime"])) 
     availableTime.Add((DateTime) row["AvailableTime"]); 
} 

foreach(DataRow row in resultTable.Rows) 
{ 
    if (!availableLocation.Contains((string) row["AvailableTime"])) 
     availableLocation.Add((string) row["AvailableLocation"]); 
} 
return new object (id, resultTable.Rows[1], resultTable.Rows[2], availableTime, availableLocation); 

我的服務器上做這個(ASP.NET)和服務器負責對運行查詢和前處理數據發送給用戶。

在此先感謝。

+2

這將是更方便地提供正確的答案和幫助,如果你可以分享你的表架構 – Tommassiov

+0

運行查詢和看看哪一種更好。有時運行兩個簡單的查詢比一個複雜的查詢要好。這一切都取決於,而且很難用所給的信息來說。你必須測試它。 –

+0

你需要做的客戶端處理在兩種情況下獲得一個「樹」了SQL的。 SQL返回*表格*數據。在C#中,這樣的轉換(同時保留單個查詢)對於LINQ來說是微不足道的。 – user2864740

回答

0

無論是哪種情況,都需要在客戶端上執行處理,以便從SQL中獲取「樹」。 SQL返回表格未標準化的數據。


明智的性能和速度明智的,它會更好,如果我做的兩個單獨的查詢檢索這些信息,或者做一個連接,然後遍歷列表兩次?

通常,在SQL中進行連接更快,更容易。在代碼中手動循環SQL選擇是有效地使RA無用的一種方式,因爲任何散列/合併連接都變爲「嵌套循環」。

由於C#支持LINQ這樣的轉換,這是我的「第一選擇」 - 好吧,首先在使用真正的LINQ到數據庫提供程序之後 - 來處理這種情況。

採取查詢(在那裏我已經改名爲「ID」爲理智):

SELECT i.item_id, i.title, i.details, t.available_time 
FROM items i 
JOIN times t ON t.item_id = i.item_id 

的加盟形式將返回一組結果-的(item_id, title, details, available_time)

現在將查詢結果讀入「readItems」的集合中,使得類型符合IEnumerable<{of the same fields as above}>,然後從數據重建樹結構。

var items = readItems 
    // The group by "re-normalize" on the key and the selector 
    // is still key on RS - as the title/details are FDs on item_id 
    .GroupBy(i => new { i.item_id, i.title, i.details }) 
    .Select(g => new ItemWithTimes { 
     ItemId = g.Key.item_id, 
     Title = g.Key.title, 
     Details = g.Key.details, 
     // capture collected data 
     AvailableTimes = g, 
    }); 

當然,如果您使用LINQ到SQL/EF提供商(而不是上述的想象LINQ到對象),則可以跳過手動經歷平坦「readItems」 result-組。


也有一些例外,一般用超非歸結果集,其中多個查詢可能更合適 - 這通常會影響非常深樹木或當「大」列複製。

此外,像SQL Server的一些數據庫支持XML,它可以處理超非歸一化的結果集(又名樹),而無需經過平表格結果集。

在任何情況下,你會知道你需要做這在時機成熟時 - 並保持清潔DAL(而不是泄露訪問所有的地方)將改變實現比較瑣碎。

+0

我還可以做同樣的事情,如果我有一個第三張表,我想要一個數據列表 – Steve

+0

@Steve Sure [你只需進一步將組值設置在適當的鍵上],但是你進入「深」樹的領域,並交易更多的服務器效率(RA聯合),以降低客戶端效率(儘管group-by可能是hash-join操作)。有一些臨界點和維護點。我通常只是讓LINQ2SQL爲我做所有的辛苦工作。老實說,在很多情況下,這並不重要 - 它在哪裏,這就是我關注的「優化」。 – user2864740

+0

如果服務器必須處理數據,那麼該怎麼辦?因爲我正在處理一個asp.net項目 – Steve

0

如果我理解正確的問題,你不需要join都:如果你想刪除重複,改變union allunion

select PropertyA 
from tableA 
where id = XXX 
union all 
select PropertyC 
from tableB 
where id = XXX; 

+0

權,工會列。但我仍然想知道哪一個表現更好。 2查詢或1 – Steve

+0

@Steve。 。 。兩個查詢產生了準備查詢,編譯它們並將它們來回傳遞到數據庫的開銷。一個查詢應該表現更好。 –

0

的簡單連接查詢會是這樣的

Select A.*, B.AvailableTime 
from TableA A 
inner join TableB B on A.ID=B.ID 

但是你可以通過使用串聯到一個逗號分隔字符串

select A.*, (SELECT ', ' + B.AvailableTime 
     FROM TableB B 
     WHERE A.ID=B.ID 
     FOR XML PATH('')) AS Timings 
from TableA A 

避免重複但是,這取決於你的要求,這一個更適合你。

+0

我更關心的是性能和速度,而不是查詢本身 – Steve

+0

性能明智的,而不是發送兩個結果集的應用程序,並加入有,發送單個ResultSet顯然會更快。如果結果集沒有重複,則會節省發送更大數據的開銷。嘗試第二個查詢。 – Miller