2014-12-12 45 views
1

我有點難以忍受我需要爲工作編寫的查詢。我有以下兩個表格:SQL使用兩個表中的值作爲其他列名作爲列名

|===============Patterns==============| 
|type  | bucket_id | description | 
|-----------------------|-------------| 
|pattern a | 1   | Email  | 
|pattern b | 2   | Phone  | 


|==========Results============| 
|id  | buc_1  | buc_2 | 
|-----------------------------| 
|123 | pass  |   | 
|124 | pass  |fail  | 

在結果表中,我可以看到實體124未通過buc_2中的驗證檢查。查看模式表,我可以看到bucket 2屬於模式b(bucket_id對應於結果表中的列名),所以實體124未通過手機驗證。但是,我該如何編寫一個查詢來將這兩個表連接到一列的值?如何調用此查詢的限制很可能會阻止我使用任何遊標。

+2

你需要什麼來得到結果?你不能以這種方式「加入」它們,但是你可以爲每個'buc_X'列創建一個特定的連接子句。 – 2014-12-13 00:00:59

+2

你可以重組你的桌子嗎?這不是規範化數據庫的良好實現。每當你添加一個新的模式,你需要添加一個新的列到你的結果表... – sgeddes 2014-12-13 00:09:46

+0

哪個版本的Oracle DB你有?你應該看看PIVOT和UNPIVOT的概念 - http://oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1.php – Steam 2014-12-13 00:26:33

回答

0

如果您使用Oracle≥11g,另一種方法是使用UNPIVOT operation。這將在查詢執行轉換成排列:

select * from Results 
unpivot ("result" for "bucket_id" in ("buc_1" as 1, "buc_2" as 2)) 
join Patterns 
using("bucket_id") 
where "result" = 'fail'; 

不幸的是,你還是要硬編碼的列名稱。

請參閱http://sqlfiddle.com/#!4/a3eae/17

+0

Steam上面提到了pivot/unpivot,但我很高興看到一個語法的例子!漂亮的功能!我能夠使用它來到我需要的地方。謝謝! – Moose 2014-12-15 15:04:59

1

一些粗俗的解決方案:

SELECT "id", "description" FROM 
Results JOIN Patterns 
ON "buc_1" = 'fail' AND "bucket_id" = 1 

union all 

SELECT "id", "description" FROM 
Results JOIN Patterns 
ON "buc_2" = 'fail' AND "bucket_id" = 2 

或者,一個非常可能是更好的執行計劃:

SELECT "id", "description" FROM 
Results JOIN Patterns 
ON "buc_1" = 'fail' AND "bucket_id" = 1 
OR "buc_2" = 'fail' AND "bucket_id" = 2; 

這將爲每個id鬥1有失敗病例報告所有故障描述或2.

請參閱http://sqlfiddle.com/#!4/a3eae/8爲一個現場示例


話雖這麼說,在的解決辦法是可能是您的模式更改爲更易於管理。假設使用association table來存儲每個失敗的測試 - 因爲您事實上在這裏有一個many to many relationship

+0

我希望改變模式是一種選擇!當我看到桌子時,我有點生氣。這個聯盟的想法很聰明!我可以使用它,但我必須看看執行時間如何。儘管我一次只能拉一個id,但結果表中會有數百萬個值。 – Moose 2014-12-13 01:42:51

0

在我看來,你真正想知道的是在條件失敗的情況下,Pattern條目的描述(在您的示例Phone中)。不管具體的例子是什麼,你都想要一個滿足這種條件的解決方案,而不僅僅是你的特定例子。

我同意上面的評論。您的存儲區條目應該是元組(行)而不是參數,並且您應該共享每個表上的ID,以便實際加入它們。例如,考慮添加一個存儲桶列併爲其編號索引,然後添加一個結果列來存儲狀態。就像這樣:

|===============Patterns==============| 
    |type  | bucket_id | description | 
    |-----------------------|-------------| 
    |pattern a | 1   | Email  | 
    |pattern b | 2   | Phone  | 


    |==========Results====================| 
    |entity_id  | bucket_id |status | 
    |-------------------------------------| 
    |123   | 1   |pass | 
    |124   | 1   |pass | 
    |123   | 2   |  | 
    |124   | 2   |fail | 

1,使用一個內連接:http://www.w3schools.com/sql/sql_join_inner.asp和WHERE子句來篩選只有那些失敗的水桶:

2,請問這個例子幫助?

SELECT Patterns.type, Patterns.description, Results.entity_id,Results.status 
INNER JOIN Results 
ON 
Patterns.bucket_id=Results.bucket_id 
WHERE 
Results.status=fail 

最後,我還要一個primary_key列添加到每個表,以確保索引是每一個獨特的組合更快。

謝謝!

相關問題