2017-07-08 68 views
0

我有以下內容的名爲僱工表SQL:簡化或多個列的查詢

id A B C D E F G 
1 8 4 6 3 2 5 2 
1 7 3 1 2 1 3 7 
3 9 2 3 3 2 6 1 
4 6 1 2 4 5 5 7 
4 6 4 6 3 2 5 2 

我不喜歡這個

employe.where( 
    A > 7 & 
(

(C<3 & D<3 & E<3 & F<3 & G<3) 
|(B<3 & D<3 & E<3 & F<3 & G<3) 
|(B<3 & C<3 & E<3 & F<3 & G<3) 
|(B<3 & C<3 & D<3 & F<3 & G<3) 
|(B<3 & C<3 & D<3 & E<3 & G<3) 
|(B<3 & C<3 & D<3 & E<3 & F<3) 

) 
) 

查詢是否有什麼辦法可以簡化上述查詢?因爲我的表格中有20多列,我已經對所有列做了上述查詢。它看起來很醜,每行都有相同的代碼。即使我能像這樣纔好看

q1 = [C, D, E, F, G] 
q2 = [B, D, E, F, G] 
q3 = [B, C, E, F, G] 
q4 = [B, C, D, F, G] 
q5 = [B, C, D, E, G] 
q6 = [B, C, D, E, F] 
employe.where( 
    A > 7 & 
(
    q1<3 | q2<3 | q4<4 | q5<3 | q6<3 
) 
) 
+2

這不是MySQL語法。你如何查詢數據庫? –

+1

這種問題可能是設計不佳的症狀 – Strawberry

回答

0

我沒有MySQL來檢查,但有可能做這樣的事情:

SELECT * FROM @employee e 
INNER JOIN (SELECT id, A, 
CASE WHEN a < 3 THEN 0 ELSE 1 END + 
CASE WHEN b < 3 THEN 0 ELSE 1 END + 
CASE WHEN c < 3 THEN 0 ELSE 1 END + 
CASE WHEN d < 3 THEN 0 ELSE 1 END + 
CASE WHEN e < 3 THEN 0 ELSE 1 END + 
CASE WHEN f < 3 THEN 0 ELSE 1 END + 
CASE WHEN g < 3 THEN 0 ELSE 1 END as cnt from @employee) c 
on e.id = c.id 
WHERE e.A > 7 AND c.cnt < 3 

如果我正確你想了解你找到其中一列大於7的實例,其中至少四列其他五列小於三。我的例子通過一個簡單的邏輯技巧實現了這一點(對於所有列)。如果計算AG的所有實例不小於3,並檢查任何列的值小於3,那麼該列的值大於7,那麼您知道其他值最大不小於3,因爲列本身是2這是不是一個小於3

擴大對所有列的例子,你再拿到

SELECT * FROM @employee e 
INNER JOIN (SELECT id, 
CASE WHEN a < 3 THEN 0 ELSE 1 END + 
CASE WHEN b < 3 THEN 0 ELSE 1 END + 
CASE WHEN c < 3 THEN 0 ELSE 1 END + 
CASE WHEN d < 3 THEN 0 ELSE 1 END + 
CASE WHEN e < 3 THEN 0 ELSE 1 END + 
CASE WHEN f < 3 THEN 0 ELSE 1 END + 
CASE WHEN g < 3 THEN 0 ELSE 1 END as cnt from @employee) c 
on e.id = c.id 
WHERE (e.A > 7 OR e.B > 7 OR e.C > 7 OR e.D > 7 OR e.F > 7 or e.G > 7) 
AND c.cnt < 3 
0

如果列表中的所有值(列)必須小於3,則最大價值在此列表中必須也小於3,因此您可以使用greatest函數,如下所示:

Where 
    Greatest(c, d, e, f, g) < 3 
    Or 
    Greatest(b, d, e, f, g) < 3 
    Or 
    Greatest(b, c, d, e, f) < 3 
    Or 
    .....