2012-06-04 106 views
0

我有以下查詢,但它不會返回where子句的任何結果,即使存在查詢的那種名稱的行時也是如此。如果我刪除where子句,則將返回CompanyLocation表中的所有記錄。我的查詢出了什麼問題?SQL like子句沒有返回任何結果

SELECT c.* 
FROM  [MyDb].[dbo].[Company] AS c 
INNER JOIN [MyDb].[dbo].[CompanyOfficeLocation] AS col ON c.Id = col.CompanyId 
INNER JOIN [MyDb].[dbo].[OfficeLocation] AS ol ON ol.Id = col.OfficeLocationId 
WHERE ol.Name like '%Actual Name In This Table%'; 

表結構:

Company 
    Id 
    etc ... 

CompanyOfficeLocation 
    CompanyId 
    OfficeLocationId 

OfficeLocation 
    Id 
    etc ... 
+1

這樣的查詢似乎很好 - 但沒有看到表結構和示例數據,這不能被回答... –

+0

如果你想知道示例數據,那麼只需假設任何東西在OfficeLocation。例如,如果OfficeLocation名稱是'位置A',並且我在那裏搜索並返回零結果。 – newbie

+0

@newbie - 我認爲這個聲明是按原樣工作的。事實並非如此,它確實取決於您向我們提供更多信息。尤其是當被要求時。下面的語句返回什麼?SELECT * FROM OfficeLocation WHERE名稱LIKE'%Location A%''? –

回答

1

兩件事情給您查詢:

  1. 您指定的辦公室位置(給出的ol.Name值)必須具有由其OfficeLocationId的CompanyOfficeLocation表中的記錄使用的Id值。

  2. 您在#1中獲得的CompanyOfficeLocation記錄必須具有公司表中存在的CompanyId。

如果這兩個標準中的任何一個不符合,那麼您的查詢結果中將不會顯示任何記錄。 INNER JOIN本質上是一個'AND'子句。如果記錄不能與至少一個INNER JOINed表相關,那麼該記錄根本不會顯示。

如果您想讓記錄顯示出來,儘管連接表中沒有任何相關記錄,您可能需要考慮使用OUTER JOIN s。在你的情況下加入一個正確的。

1

我沒有發現任何錯誤,但是我建議你加入,以保持標準時切換列ON後。

相反的 - INNER JOIN [MyDb].[dbo].[OfficeLocation] AS ol ON ol.Id = col.OfficeLocationId

執行 - INNER JOIN [MyDb].[dbo].[OfficeLocation] AS ol ON col.OfficeLocationId = ol.Id爲展現創造了一項紀錄

+0

「INNER JOIN」場景中的列順序無關 - 這無濟於事。 –

+0

@marc_s你說得對。它只是爲了維護標準。 – JHS