簡體   English   中英

SQL 服務器 - Select 左連接 NULL 記錄 WHERE 條件

[英]SQL Server - Select Left Join NULL record WHERE condition

我正在嘗試對通過 LEFT JOIN 連接的兩個表執行 SELECT 查詢,其中連接表中可能沒有記錄。 就像是:

--SELECT row using AreaID
SELECT *
FROM Rate
LEFT JOIN Area
ON Rate.AreaID = Area.AreaID
WHERE ProductID = @ProductID
AND Area.PostcodeOutcode = @PostcodeOutcode

這在區域表中存在@PostcodeOutcode 時有效,但如果右表中沒有記錄,我仍然需要返回左表中的記錄。

我目前正在通過這樣做來捏造它,但我知道有一個更好的解決方案:

DECLARE @AreaID int
SELECT @AreaID = AreaID
FROM Area WHERE PostcodeOutcode = @PostcodeOutcode 

--SELECT row using AreaID
SELECT *
FROM Rate
WHERE ProductID = @ProductID
AND
(
    AreaID = @AreaID
    OR (@AreaID IS NULL AND AreaID IS NULL)
)

我知道這可能很簡單,但是我的 SQL 知識有限。 請幫忙。

謝謝

亞歷克斯

將區域檢查移動到連接

SELECT * FROM Rate
LEFT JOIN Area 
  ON Rate.AreaID = Area.AreaID and Area.PostcodeOutcode = @PostcodeOutcode
WHERE ProductID = @ProductID 

更新評論中修改后的問題,這是你想要的嗎?

SELECT Rate.RatePercent FROM Rate
INNER JOIN Area 
  ON Rate.AreaID = Area.AreaID and Area.PostcodeOutcode = @PostcodeOutcode
WHERE 
  ProductID = @ProductID
UNION ALL
SELECT Rate.RatePercent FROM Rate 
where
  ProductID = @ProductID 
and 
  AreaId is null 
and 
 not exists(select PostCodeOutCode From Area where PostCodeOutCode=@PostCodeOutcode)

這兩者之間的左連接存在差異:

Select *
From Table1 t1
Left Outer Join Table2 t2 On t2.id = t1.id
Where t2.somevalue = @SomeParameter

Select *
From dbo.Table1 t1
Left Outer Join dbo.Table2 t2 On t2.id = t1.id And t2.somevalue = @SomeParameter

后者將過濾Table2,而前者將過濾Table1和Table2之間的連接。 所以,這意味着第一個查詢會在 id 上連接兩個表中的所有行,然后過濾 somevalue 與參數不匹配的行,即這通常也會過濾掉 somevalue 為 null 的行,因為沒有排。

第二個查詢會在 id 上將 table1 與 table2 連接起來,但 table2 會首先在匹配參數上進行過濾,因此也會返回不匹配的行,因此不會被過濾掉。

附帶說明:您應該始終在查詢中提供表的架構(出於性能原因)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM