2017-04-06 54 views
0

我在我的ColorAssign表中有以下數據;如何在沒有UNION的情況下通過SQL中的不同條件從同一表中獲取數據?

| PKID | Name | Type | HasAssigned | 
| 11 | Red  | 1 | True  | 
| 12 | Blue | 2 | False  | 
| 13 | Yellow | 3 | False  | 
| 14 | Red1 | 1 | False  | 
| 15 | Yellow1 | 3 | True  | 
| 16 | Blue1 | 2 | False  | 

注意,在這個表中我有顏色類型的類型字段和assignstatus在HasAssigned字段還與不同的名稱不同的主密鑰(可以是相同的名稱 - 但類型是找到的實際顏色的標識符)。

我的目標是獲取數據的條件: - 查找與Hasassigned =真色彩類型,或者該類型中沒有記錄有真實的記錄。然後鍵入Hasassigned = false的顏色類型。所以我的結果是;

| 11 | Red  | 1 | True  | 
    | 12 | Blue | 2 | False  | 
    | 15 | Yellow1 | 3 | True  | 
    | 16 | Blue1 | 2 | False  | 

這對UNION來說可能是通過編寫兩個查詢,我們可以用一個查詢來做到這一點。尋找其他優化的方式?

+2

這是MySQL或SQL服務器? –

+1

您的病情描述不清楚。但是,如果我理解正確,則需要爲每個Type使用HasAssigned = true的顏色,或者如果Type的任何一行沒有爲true,則HasAssigned = false。那是對的嗎? –

+0

是斯隆,我會更新我的問題的條件。 – pvaju896

回答

1

在SQL-Server,您可以使用以下查詢:

SELECT PKID, Name, Type, HasAssigned 
FROM (
    SELECT PKID, Name, Type, HasAssigned, 
      RANK() OVER (PARTITION BY Type 
         ORDER BY CASE WHEN HasAssigned='True' THEN 1 ELSE 2 END) AS rnk 
    FROM ColorAssign) AS t 
WHERE t.rnk = 1 

Demo here

+0

我們可以得到使用結合或什麼的,我希望這將更加優化,然後子查詢...... – pvaju896

+0

@ pvaju896你給我的查詢嘗試其他方法同樣的結果?使用窗口函數來確定優先級通常是最有效的方法。 –

+0

是的,我試圖完美的工作。但我只是想知道是否有其他方式。 – pvaju896

1

如果你正在使用MySQL,以下應該產生你要的結果:

SELECT 
    `PKID`, 
    `Name`, 
    `Type`, 
    `HasAssigned` 
FROM `ColorAssign` 
GROUP BY `Type` 
ORDER BY `HasAssigned` DESC; 
+0

這對我來說不起作用,通過在MSSQL查詢中一起工作並按組進行排序。 – pvaju896

-1

如果我沒有理解你的要求,在WHERE子句中的OR語句會做你想要什麼:

WHERE (
     (Type = @Type AND HasAssigned = True) 
     OR 
     HasAssigned = False 
     ) 
+0

這不會做OP的想法。 –

+0

我不會傳遞類型之類的參數,需要通過查詢查找所有類型的記錄 – pvaju896

0

我只是想通過這種方式,我可以得到的結果;

select * from ColorAssign ci where 
(ci.HasAssigned = 'True' 
OR 
NOT EXISTS(select 1 from ColorAssign sc where sc.Type = ci.Type AND sc.HasAssigned = 'True') 
) 
相關問題