2009-11-07 44 views
0

我的表中有以下數據。從表格中獲取數據,使用行作爲列

alt text http://img26.imageshack.us/img26/3746/productfield.png

我想提取產品編號具有該標準,

FieldValue = 1.0 and FieldValue = 'Y' and FieldValue = 'N' 

這是不可能的使用下面的查詢

select * from MyTable 
WHERE (FieldId = 50 AND (FieldValue BETWEEN '1.0' AND '1.0')) 
AND (FieldId = 55 AND FieldValue = 'Y') 
AND (FieldId = 60 AND FieldValue = 'N') 

,我不能用這樣的查詢。這也取產品編號103和104

select * from MyTable 
WHERE (FieldId = 50 AND (FieldValue BETWEEN '1.0' AND '1.0')) 
OR (FieldId = 55 AND FieldValue = 'Y') 
OR (FieldId = 60 AND FieldValue = 'N') 

alt text http://img690.imageshack.us/img690/16/productfieldresult.png

我不知道產品編號提前。事實上,我想使用FieldValue標準提取ProductId。我不能在我的where子句中使用ProductId,因爲我不知道。只有我知道是fieldValue和FieldId。

感謝您的幫助!

+0

我只需要productId映射標準我已經提到。沒有必要重新排列連續的列。 – Kashif 2009-11-07 14:21:04

+0

我覺得dotjoe解決方案更相關,因爲你想根據fieldvalue標準執行搜索,而不是fieldvalue和fieldid。 (: – 2009-11-07 14:55:29

+0

的確,這是一個很好的問題:你想只過濾FieldValue還是(FieldId,FieldValue) - 組合?你的問題聽起來更像前者,但是你的SQL例子和「常識」導致第二個問題。 .. – Heinzi 2009-11-07 15:15:16

回答

0

我猜你想以下幾點:

SELECT ProductId from myTable 
WHERE ProductId IN (SELECT ProductId FROM myTable WHERE FieldId = 50 AND FieldValue = '1.0') 
    AND ProductId IN (SELECT ProductId FROM myTable WHERE FieldId = 55 AND FieldValue = 'Y') 
    AND ProductId IN (SELECT ProductId FROM myTable WHERE FieldId = 60 AND FieldValue = 'N') 

(你可以把在外部選擇的標準之一,但我想這是更容易閱讀這種方式。)

+0

工作!感謝您的幫助。 – Kashif 2009-11-07 14:42:11

0

這是怎麼回事?

產品編號= 101和fieldValue方法IN( '1.0', 'Y', 'N')

[編輯]

也許可以使用這樣的子查詢?

SELECT * 
FROM MyTable 
WHERE ProductId = 
-- SubQuery for searching ProductId based on FieldId and FieldValue 
(SELECT TOP 1 ProductId 
FROM MyTable 
WHERE (FieldId = 50 AND (FieldValue BETWEEN '1.0' AND '1.0')) 
+0

ProductId是我想要使用FieldValue條件得到的值。 所以我不能使用PrdouctId = 101 – Kashif 2009-11-07 14:30:11

+0

不那麼明顯。事實上,你的問題並不那麼明顯。正如Guffa所說,一行中的字段永遠不會有兩個值。我的「IN」解決方案相當於他的 – 2009-11-07 14:31:47

+0

@Muhammad再次檢查它......這次使用子查詢 – 2009-11-07 14:38:28

0

的fieldValue方法的記錄不能有兩個值一次,這就是爲什麼像x=1 and x=2條件永遠不可能是真的。

你想在條件之間使用or

ProductId = 101 and (FieldValue = '1.0' or FieldValue = 'Y' and FieldValue = 'N') 

編輯:
如果你必須要找到與FieldId和fieldValue方法值的那個組合的產品編號,你必須做一些加盟:

select * from MyTable 
where ProductId = (
    select ProductId 
    from MyTable m 
    inner join MyTable m2 on m2.ProductId = m.ProductId and m2.FieldId = 55 and FieldValue = 'Y' 
    inner join MyTable m3 on m3.ProductId = m.ProductId and m3.FieldId = 60 and FieldValue = 'N' 
    where FieldId = 50 and FieldValue = '1.0' 
) 
+0

謝謝,我不提前知道ProductId,所以我不能在我的地方使用它。任何解決方案使用臨時表等。 – Kashif 2009-11-07 14:33:39

+0

我明白了。我添加了上面的解決方案。 – Guffa 2009-11-07 14:51:44

1
select distinct t1.productid 
from mytable t1 
inner join mytable t2 on t1.productid = t2.productid 
inner join mytable t3 on t2.productid = t3.productid 
where t1.fieldvalue = '1.0' and t1.fieldid = 50 
and t2.fieldvalue = 'Y' and t2.fieldid = 55 
and t3.fieldvalue = 'N' and t3.fieldid = 60 
+0

很好的答案...... OP的標準是什麼......只有fieldval而不是FieldId .. – 2009-11-07 14:57:05

+0

但你忘了在內部連接中添加mytable。 內部聯接MYTABLE T2上t1.productid = t2.productid 內部聯接mytablet T3上t2.productid = t3.productid – 2009-11-07 14:58:12

+0

糟糕忘mytable的 – dotjoe 2009-11-08 17:51:50