2016-06-28 64 views
2

我有3個表,CategoryStepCategoryStep,其中CategoryStep將兩個其他表關聯在一起。我想根據StepID返回所有具有真/假列的類別,無論該關係是否存在於CategoryStep中。檢查是否存在關係並返回true或false

的表的模式很簡單,

Category: 
CategoryID  | CategoryName 

Step: 
StepID   | StepName 

CategoryStep: 
CategoryStepID | CategoryID | StepID 

當試圖基於StepID得到的結果,我只得到存在的關係,而不是那些沒有。

SELECT [CategoryID], [Category], CAST(CASE WHEN [CategoryStep].[CategoryStep] IS NULL THEN 0 ELSE 1 END AS BIT) AS related 
FROM Category 
LEFT JOIN CategoryStep ON Category.CategoryID = CategoryStep.CategoryID 
INNER JOIN Step ON CategoryStep.StepID = Step.StepID 
WHERE Step.StepID = 2 

步驟表:

|StepID | StepName 
|-------|--------- 
| 1  | StepOne 
| 2  | StepTwo 
| 3  | StepThree 

分類表:

| CategoryID | CategoryName 
|------------|------------- 
| 1   | Holidays 
| 2   | States 
| 3   | Cities 
| 4   | Animals 
| 5   | Food 

CategoryStep表

| CategoryStepID | CategoryID | StepID 
|----------------|------------|------- 
| 1    | 1   | 1 
| 2    | 1   | 2  <-- 
| 3    | 2   | 1 
| 4    | 2   | 3 
| 5    | 3   | 2  <-- 
| 6    | 4   | 1 
| 7    | 4   | 2  <-- 
| 8    | 4   | 3 
| 9    | 5   | 1 
| 10    | 5   | 3 

所以,如果我一直在尋找StepID = 2的結果表我我期待的是:

| CategoryID | Category | Related 
|------------|----------|-------- 
| 1   | Holidays | 1 
| 2   | States | 0 
| 3   | Cities | 1 
| 4   | Animals | 1 
| 5   | Food  | 0 

回答

3

嘗試用LEFT JOIN代替INNER JOIN

更新:

的致命缺陷與你原來的嘗試是WHERE條款。您正在執行正確的LEFT JOIN,但WHERE子句過濾了不匹配的類別記錄。在下面的查詢中,我將步驟ID的檢查移到了它所屬的連接條件中。

SELECT [CategoryID], [Category], 
    CAST(CASE WHEN [CategoryStep].[CategoryStep] IS NULL THEN 0 ELSE 1 END AS BIT) AS related 
FROM Category 
LEFT JOIN CategoryStep 
    ON Category.CategoryID = CategoryStep.CategoryID AND 
     CategoryStep.StepCodeID = 2 
LEFT JOIN Step 
    ON CategoryStep.StepID = Step.StepID 
+0

仍看不到非相關類別,只有有關係的類別。我認爲這是解決問題的方法,但我錯過了一些東西。 – Alex

+0

請向我們展示一些示例數據。 –

+1

@Alex我更新了我的答案,它現在應該可以工作。 –

相關問題