创建复杂查询以执行存储在列中的查询?

时间:2016-11-21 15:27:44

标签: c# sql sql-server

当我满足(一个或多个)条件时,我试图从表中获取一些信息,但这些条件存储在其他表中。

以下是3个表的截图:

tables

所以我需要一个查询来执行此操作:

  1. 给定状态(IDStatus)和动作(IDAction
  2. 如果有IDCondition(可以NULL,一个或多个)

    一个。如果有,请使用IDocField作为IDoc表中的列,使用ConditionOperator作为条件(将其视为=<>)和ConditionValue上的值。

    B中。如果有多个,与之前相同,但使用AND的每个条件。

    ℃。如果是NULL,请直接转到第3点

  3. 获取与上述所有内容相匹配的SubjectSendToCCCCOFileTemplate

    < / LI>

    我想尝试这个,因为它会减少我的C#代码,但如果这太复杂或不合理,我会做多个查询,就像我上面解释的那样。

    我问这个,因为我不确定如何在SELECT中获得多个条件。我的意思是:

    如果有多个条件,我怎样才能执行它们或者在一个查询中获取所有这些条件但是在第3点有所有返回的东西?

    示例:

    SELECT * 
    FROM WF_MailCondition 
    WHERE IDCondition = 1
    

    这将返回IDCondition等于1的所有条件(键可以重复)但是我必须使用所有三列创建类似ID = 1 ID的条件IDocField中的=ConditionOperator中的1ConditionValue中的IDCondition

    我知道图像中存在一些不一致之处,例如NNSELECT 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") (非空)但我说它可以为空(我正在修理这些东西)。

    我的SQL:

    SELECT "HERE SELECT 3 COLUMNS..."

    如何IDCondition以及NULL Subject是否直接获取第一个SELECT中请求的列(SendTo"ACTION FROM OUTSIDE"等。 )

    import java.util.HashMap; import java.util.Map; public class HelloWorld { public static void main(String []args){ Map<String, Integer> myMap = new HashMap<String, Integer>(); String[] products = {"Apple", "Pear", "Banana", "Apple"}; String[] amounts = {"2", "3", "3", "2"}; for (int i = 0; i < products.length; i++) { String product = products[i]; int amount = Integer.valueOf(amounts[i]); if (myMap.containsKey(product)) { myMap.put(product, myMap.get(product) + amount); } else { myMap.put(product, amount); } } for (String product : myMap.keySet()) { System.out.println(product + ": " + myMap.get(product)); } } } 是一个参数化语句。

    忘记外键,我们没有使用它(老板的决定......)。

    我这样做是因为是“事件”的事情。我在我的C#代码中调用一个方法来查看是否有要发送的邮件。但是这封邮件可以没有,一个或多个条件。这是有比所有必须发送邮件更多的选项。也许在工作流程中没有必要发送电子邮件,但在代码中是“硬编码”所以我可以完全自由地做我需要的关于该功能。

    也许所有这些都可以是一个函数或一个存储过程,但我对它和它们的性能一无所知。

    如果您需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:0)

我建议如下: - 创建QueryBuilder班级 你有哪些方法:

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

然后使用“中间层”根据条件处理查询操作 这样你就可以最大程度地控制正在进行的一切

答案 1 :(得分: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)