2011-09-16 61 views
1

如果你有一個類似於這樣的查詢有沒有更好的方法?有沒有一種替代方法來處理所有的「或」語句?只是想figureout一種方式來擺脫所有的「手術室」更好的寫法查詢方式

版本的:SQL Server 2008 R2的

Select ProductID 
From product.Products 
Where 
(Attribute1 <> 0 
or Attribute2 <> 0 
or Attribute3 <> 0 
or Attribute4 <> 0 
or Attribute5 <> 0 
or Attribute6 <> 0 
or Attribute7 <> 0 
or Attribute8 <> 0 
) 
AND 
(CatAttrib1 <> 0 
or CatAttrib2 <> 0 
or CatAttrib3 <> 0 
) 
+1

這樣的氣味就像可怕的餐桌設計,你需要規範事情。 –

+0

你是對的....我不能控制數據模型不幸的是....你是對的,雖然它很爛。 – scarpacci

+0

什麼是數據類型? BIT,INT,...?你可以添加列到表中? –

回答

3

您可以創建一個視圖,如(假設屬性列爲主INT,不BIT):

CREATE VIEW product.ViewProducts 
AS 
    SELECT Attribute1, Attribute2, ... 
     Attributes = CASE 
      WHEN Attribute1 + Attribute2 + Attribute3 ... > 0 
      THEN 1 ELSE 0 END, 
     CatAttrib1, CatAttrib2, ..., 
     CatAttribs = CASE 
      WHEN CatAttrib1 + CatAttrib2 + CatAttrib3 ... > 0 
      THEN 1 ELSE 0 END 
    FROM product.Products; 
GO 

現在,你可以說:

SELECT ProductID 
    FROM product.Products 
    WHERE Attributes = 1 
    AND CatAttribs = 1; 
+0

那是我唯一想到的東西,就是類似的東西....就像做了所有這些事情的總和,並檢查> 0。謝謝Aaron。 – scarpacci

+0

注意負數,他們可以將其調平到0或更低 –

+0

'Attribute1 |屬性2 |屬性3 ... <> 0'? –

1

它看起來像你的數據庫不被標準化。

讓我們來看看目前的方案。你有這樣的事,對吧?

| id | name | attribute1| attribute2 | attribute3 | ... | 
-------------------------------------------------------- 
| 1 | car1 |  1  |  2  |  0  | ... | 

有了這樣一張表,or s是要走的路。我的意思是:還有其他同樣尷尬的構造,但可能會使用更復雜的構造,但在以合理的方式構造數據之前,您將被迫通過大量這些問題。

我會帶你走過規範這部分模式的過程,同時我會放棄一些有用的鏈接。

你想有兩個表,而不是:一個product表看起來像這樣:

| id | name | 

而且一個product_attribute表類似於以下內容:

| product_id | attribute | value | 

的例子記錄上面會因此代表新結構:

product

| id | name | 
------------- 
| 1 | car1 | 

product_attribute

| product_id | attribute | value | 
---------------------------------- 
|  1  |  1  | 1 | 
|  1  |  2  | 2 | 
|  1  |  3  | 0 | 

見我們去做什麼了?我們做到這一點,所以product將與product_attributesone-to-many關係。這個模式現在跟在First Normal Form之後,因爲我們不再是repeating groups across columns。讓我們回到您的查詢:您想選擇每個product,其中沒有值爲零的屬性。因此,我們加入了兩個表(這樣每product將被連接到其product_attribute S),盡我們的過濾:

SELECT * FROM product 
    JOIN product_attribute 
    ON (product.id = product_attribute.product_id) 
    WHERE product_attribute.value <> 0 

看起來更清潔的方式,不是嗎?

Here是SQL Server連接上的msdn條目。

+0

我同意你的意見,但OP說他不能改變模式。 –

+0

@Aaron:是的,現在看到了--.-' – cbrandolino

1

雖然這似乎醜陋,這只是一個UNPIVOT做了兩次,這當然可以通過意見簡化。第一個unpivot子查詢爲您提供了您的Attributes列,外部的unpivot爲您提供了CatAttribs列。然後,你可以在最後做一個簡單的WHERE子句。

SELECT DISTINCT 
     ProductID 
     --,Attributes 
     --,CatAttributes 
    FROM 
     (
      SELECT 
        ProductID 
        ,Attributes 
        ,CatAttrib1 
        ,CatAttrib2 
        ,CatAttrib3 
       FROM 
        (
        SELECT 
          ProductID 
          ,Attribute1 
          ,Attribute2 
          ,Attribute3 
          ,Attribute4 
          ,Attribute5 
          ,Attribute6 
          ,Attribute7 
          ,Attribute8 
          ,CatAttrib1 
          ,CatAttrib2 
          ,CatAttrib3 
         FROM 
          product.Products) a 
      UNPIVOT 
       (
       Attributes FOR product.Products IN 
        (
         Attribute1 
         ,Attribute2 
         ,Attribute3 
         ,Attribute4 
         ,Attribute5 
         ,Attribute6 
         ,Attribute7 
         ,Attribute8 
        ) 
       ) AS attrUnpivot 
     ) c 
UNPIVOT 
    (
    CatAttributes FOR product.Products IN 
     (
      CatAttrib1 
      ,CatAttrib2 
      ,CatAttrib3 
     ) 
    ) AS catUnpivot 
WHERE 
    ProductID = catUnpivot.ProductID 
    AND Attributes <> 0 
    AND CatAttributes <> 0 
+0

你*愛* unpivots,你呢? :) – cbrandolino

+0

不特別。我只是每天都用這種垃圾數據。 8-) – Sumo

0

只是一個快速的思想,總結了所有的人,看看結果是大於,請確保您的情況的讀取絕對值有任何負數。

但是我不太確定,如果你打算在這裏贏得任何表現,但是查詢可能看起來有點整齊。

相關問題