2009-02-03 40 views
0

我正在構造一個查詢,它自然會返回具有多個列的值的結果,以及一些整數值分組列(指示某個特定值列是否小計,但這本身並不與我的問題相關)。我想對這個查詢的分組列進行約束,只接受那些分組列n非零的行,如果所有分組列1 - (n -1)也非零。SQL中多列「級聯」約束的優雅語法?

好像有應該是在SQL表達這種一個很好的方式,但所有我能想出迄今已是相當麻煩的

where ((grp1 = 0 AND grp2 = 0 AND grp3 = 0 AND ... AND grpn = 0) 
    or (grp1 = 1 AND grp2 = 0 AND grp3 = 0 AND ... AND grpn = 0) 
    or (grp1 = 1 AND grp2 = 1 AND grp3 = 0 AND ... AND grpn = 0) 
    ... 
    or (grp1 = 1 AND grp2 = 1 AND grp3 = 1 AND ... AND grpn = 1) 

這是很難理解的,如果你的概念我們正在閱讀它,看起來像一個SQL引擎提出一個體面的優化會更困難,而且通常也會堵塞日誌,並將SQL中的重要部分埋入噪聲中。

由於這個概念似乎不太常見,我希望有更好的方式來表達它,通常會更簡潔,並希望在服務器本身更高性能(假設我的天真版本不打算這是有效的)。

+0

Ben的解決方案似乎即將給您所提供的信息的權利,但如果你給這個問題的完整描述(模式,完整的SQL等),有人也許能夠通過從不同方向觀察問題,爲您提供更好的解決方案。 – 2009-02-03 18:45:23

+0

是(n)模式中的一個變量還是一個固定(但很大)的值? – MatBailie 2009-02-03 19:12:57

回答

4

你說這些值是整數。他們可以消極嗎?如果沒有,你可以只使用一組比較:

​​

編輯:其實,我也在這裏假設非零值必須在1 ...但如果這仍然可以應用的原則,不是這樣,我想象。

0

如果(n)是固定的,那麼Ben的答案似乎是最好的。

如果你的數據是標準化和(n)是可變的,我會假設你有數據這樣的事情...

data_fk | grp_id | flag 

然後你要搜索data_fk的地方標誌的各種grp_ids符合您設定的規則。規則可能(在我的想法中)被重新表示爲...

(最高的group_id標誌= 1)應該是grp_id之前(最低的group_id標誌= 0),或者所有標誌都是1,或者所有的標誌都爲0

SELECT 
    data_fk 
FROM 
    a_table 
GROUP BY 
    data_fk 
HAVING 
    ISNULL(MIN(CASE WHEN flag = 0 THEN grp_id ELSE NULL END), MAX(grp_id) + 1) 
    = 
    MAX(CASE WHEN flag = 1 THEN grp_id ELSE 0 END) + 1