2016-11-21 53 views
2

我想從一個表中的一些信息,當(一個或多個)條件(S)爲被滿足,但這條件被存儲在其他表。創建複雜查詢以執行存儲在列中的查詢?

下面是3代表的截圖:

tables

所以我需要一個查詢來做到這一點:

  1. 某個狀態(IDStatus)和行動(IDAction
  2. 如果有一個IDCondition(它可以是NULL個,一個或多於一個)

    A.如果有一個,則使用IDocField作爲來自稱爲IDoc表中的列,使用ConditionOperator作爲條件(讀此作爲=<>)和ConditionValue值。

    B.如果有不止一個,和以前一樣,但使用的每個條件與AND

    C.如果是NULL,直接進入第3點

  3. 獲取SubjectSendToCCCCO,並FileTemplate匹配所有的以上解釋。

我想試試這個,因爲它會降低我的C#代碼,但如果這是過於複雜或不可信,我會做多個查詢,如我上面所解釋的。

我問這個,因爲我不知道如何讓多個條件在SELECT。我的意思是這個:

如果有一個以上的情況下,我怎麼能執行它們或讓所有的人都在一個單一的查詢,但有一點對3中的所有返回的東西呢?

例子:

SELECT * 
FROM WF_MailCondition 
WHERE IDCondition = 1 

這將返回所有條件(鍵可以重複),有IDCondition 1。但後來我等於必須使用所有這三個列創建一個像ID = 1一個條件IDocField一直ID=ConditionOperatorConditionValue1。我知道圖像中存在一些不一致的地方,比如IDConditionNN(不爲空),但我說它可以是空的(我正在修復這個問題)。

我的SQL:

SELECT 
    Subject, SendTo, CC, CCO, FileTemplate 
FROM 
    WF_Mail AS M 
INNER JOIN 
    WF_MailStatusAction AS S ON S.IDMail = M.IDMail 
WHERE 
    (SELECT "HERE SELECT THE 3 COLUMNS TO USE A CONDITION" FROM WF_MailCondition WHERE IDCondition = S.IDCondition) 
    AND (S.IDAction = "ACTION FROM OUTSIDE" AND S.IDStatus = "STATUS FROM OUTSIDE") 

如何做好SELECT "HERE SELECT 3 COLUMNS..."如果IDConditionNULL直接將列在第一個SELECT請求(SubjectSendTo等。)

"ACTION FROM OUTSIDE"是參數化的語句。

忘記外鍵,我們不使用它(老闆的決定...)。

我這樣做,因爲是一個「事件」的事情。我在我的C#代碼中調用一個方法來查看是否有郵件發送。但是這封郵件可能沒有,一個或多個條件。這是有更多選擇比所有必須發送郵件。也許在工作流程中,不需要發送電子郵件,但在代碼中是「硬編碼」的,所以我完全可以自由地做我需要的功能。

也許所有這一切都可以是一個函數或存儲過程,但我對此並表現他們很無知。

如果您需要更多信息,請告訴我。

+1

每當你開始在數據庫中存儲查詢時,如果這真的是一個好主意,你應該退後一步。它可能容易受到sql注入的攻擊,因爲你發現它非常難以使用。 –

+0

是的,我知道,但是要求,我不能改變它,它來自頂端...我說同樣的,但無法改變它:S – matiaslauriti

回答

0

據我瞭解最多的控制,我會寫這樣的查詢:

select m.subject, m.cc 
from wf_mail m 
where exists (select 'true' 
      from wf_mailstatusaction s, wf_mailcondition c 
      where s.idmail=m.idmail 
      and s.idcondition = c.idcondition 
      and c.idocfield||c.conditionoperator||c.conditionValue = 'id>500' 
      group by s.idcondition 
      having count(s.idcondition) = 1) 
or exists (select 'true' 
      from wf_mailstatusaction s, wf_mailcondition c 
      where s.idmail=m.idmail 
      and s.idcondition = c.idcondition 
      and c.idocfield||c.conditionoperator||c.conditionValue IN ('id>500', 'id<200') 
      group by s.idcondition 
      having count(s.idcondition) > 1) 
or exists (select 'true' 
      from wf_mailstatusaction s 
      where s.idmail=m.idmail 
      and s.idcondition is null) 
+0

這不完全是我所需要的,但是您對查詢的幫助很大。缺少的是'IDStatus'和'IDAction'條件,我的意思是多個條件或不條件是我讀表存儲條件的表,比如說'IDocField' ='ID'(這個ID值是指一個表IDoc'具有一個名爲'ID'的列),並且使用'ConditionOperator' ='='和'ConditionValue' ='1'來實現concat,所以查詢也會消除'IDoc.ID = 1'。如果你有多個條件,你用'AND'寫出所有這些。這是一個棘手的部分,我不知道我是否可以在同一個查詢中執行。 – matiaslauriti

+0

當你已經有計數(s.idcondition)> 1,將在至少兩個狀態記錄工作郵件 - 並假設每conditionvalue郵件的狀態,你將不得不在s.conditonValue匹配兩種不同的條件下('值是獨一無二的','value3')。所以你在某種程度上變得和 - 不正確? – donlys

+0

該條件不是IN('value2','value3')。我必須連接'IDocField','ConditionOperator'和'ConditionValue'來形成'WHERE'子句,例如'IDocField' ='Column1','ConditionOperator' ='>'和'ConditionValue' ='500',將形成一個'WHERE'子句,說'Column1> 500'。這就是我使用'WF_MailCondition'的原因。當你做'S.ConditionValue'時,這個列不在'S'中,在'WF_MailCondition'中,我應該使用'INNER JOIN'還是'FROM'?你現在明白了麼 ?謝謝 ! – matiaslauriti

0

我建議如下: - 創建 一個QueryBuilder類在哪裏,你有這樣的方法:

* AddSelect() 
* AddFrom() 
* AddWhere() 
* ToString() 
... 

然後使用「middlelayer」根據條件 這樣,你來處理查詢cunstruction有超過一切事情

+0

我可以,是其他方法,謝謝你的答案。 – matiaslauriti