我有兩個相關的表(父-子),如果有任何附件被添加,在子表中就會有一個條目。我們正在使用一個存盤程序來獲取資料。我想為每條記錄回傳真或假。我嘗試了以下方法,
CREATE PROCEDURE [dbo]. [testname]
(
@DATE DATE
)
AS[/span
BEGIN[/span
SELECT TOP 10000
s.column1
, s.column2
, s.column3
, s.column4
, s.column5, ....,
, c.ParentID
FROM[/span
ParentTable p WITH(NOLOCK)
LEFT JOIN SomeOtherTable s WITH(NOLOCK) ON
p.ID = s.ID
LEFT JOIN ChildTable c WITH(NOLOCK) ON
p.ID = c.ParentID
WHERE[/span
p.CreatedDate >= @Date
ORDER BY
p.CreatedDate DESC;
END; END
這個作業很好,但只對在子表中有值的記錄回傳值。此外,父子之間的關系是一對多的。這個查詢也從父表為子表的每條記錄回傳相同的記錄,而且它只回傳那些在兩個表中都有條目的記錄,這不應該是這樣的。
誰能幫我解決這個問題?我正在使用 SQL Server。
uj5u.com熱心網友回復:
在一個case運算式中簡單地使用exists。
Select < 從父表>/span>列。
case when exists (select * from ChildTable c where c. ParentId=p. Id) then 1 else 0 end as HasChild
from Parent t
我正要建議使用iif()的更緊湊的形式,然后注意到你已經標記了SQL Server 2008...所以我不會!
uj5u.com熱心網友回復:
你的查詢顯然是為了說明這個問題而設計的,而不是實際的查詢。 所以這個答案也是用偽造的資料來說明聽起來像你想要的東西。
你似乎想從ParentTable中回傳記錄,用true或false來表示子表中是否有記錄。
- 你不能
ParentTable回傳記錄。 - 您不能在子表上
LEFT JOIN,然后在WHERE子句中使用子表。 這樣做會使它變成一個INNER JOIN. 。
- 如果你有一個一對多的關系,并將兩個表連接在一起,你將看到父記錄的次數與子記錄的次數相同。
有幾種方法可以看到是否有一個子記錄。 這些只是兩種解決方案。 你應該看看你選擇使用的任何查詢計劃,這樣你就可以確保它針對你的資料集進行了優化。
create table #parent (id int, value varchar(10))
create table #child (id int, parent_id int, value varchar(10))
創建聚類索引pk_parent 關于#parent (id)
創建聚類索引 pk_child on #child (id)
創建索引 idx_fk_child_parent on #child (parent_id)
insert into #parent values (1, '一'/span>), (2, '二'/span>), (3, '三')
insert into #child values (1, 1, 'red')。) (2, 3, 'blue') 。(3, 3, 'green')
/*相關的子查詢解決方案*/。
select p. *, has_child = cast(1 as bit)
from #parent p
where exists (select 1 from#child c where p. id = c.parent_id)
unionall
select p. *, has_child = cast(0 as bit)
from #parent p
where not exists (select 1 from #child c where p. id = c.parent_id)
order by p.id
/* 嵌套子查詢解決方案 */
select p.*, has_child = isnull(c.have_child, 0)
from #parent p
left join (
select distinct parent_id。has_child = cast(1 as bit)
from #child
) c on p.id = c.parent_id
order by p.id
drop table #parent, #child
這兩種方法的回傳結果如下:
id value has_child
----------- ---------- ---------
1 one 1
2 two 0
3 three 1
correlated子查詢是最明顯的,它只是根據exists或not exists將has_child設為true或false。 子查詢的解決方案不太明顯。 如果一條記錄存在,has_child將是1。 如果一條記錄不存在,has_child將是NULL。
子查詢比相關子查詢表現得更好,因為它只需要在每個表中打1次,而不是2次。 但我不知道你的表中究竟有多少條記錄,也不知道它們是如何被索引的。 因此,請看一下這兩個表的查詢計劃,看看你可以在哪些方面進行優化。
我添加了與真實資料庫中的索引相近的索引。 相關子查詢的成本是子查詢解決方案的 4 倍。
嵌套子查詢解決方案具有非常好的統計資料,CPU在內部查詢中特別低。
希望這對您有所幫助并回答您的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314531.html
標籤:
