GVKun编程网logo

在声明整数与计算查询中时,T-SQL查询给出不同的结果

21

本篇文章给大家谈谈在声明整数与计算查询中时,T-SQL查询给出不同的结果,同时本文还将给你拓展c–模运算符给出不同的结果与前导零、c#–Linq查询给出不合适的输出、java–如何在hql或jpql查

本篇文章给大家谈谈在声明整数与计算查询中时,T-SQL查询给出不同的结果,同时本文还将给你拓展c – 模运算符给出不同的结果与前导零、c# – Linq查询给出不合适的输出、java – 如何在hql或jpql查询中查询两个不同的数据库(在不同的服务器上)?、LINQ转换与我的SQL查询给出的结果不同等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

在声明整数与计算查询中时,T-SQL查询给出不同的结果

在声明整数与计算查询中时,T-SQL查询给出不同的结果

因此,我一直在尝试在查询中生成一些SQL随机数,但发现有些奇怪。

假设我运行以下查询:

declare @Random int = CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) + 1;select CHOOSE(@Random,''One'',''Two'',''Three'',''Four'',''Five'')

SQL随机数gen有点笨重,但是这里的基本思想很简单-选择1到5之间的随机数,然后将该数字作为文本显示在选择窗口中。这按预期工作。

但是,如果我使用SAME查询,而是将随机数公式粘贴到方法中,而不是将其声明为整数,那么它们全都在一行上:

select CHOOSE(CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) +    1,''One'',''Two'',''Three'',''Four'',''Five'')

运行查询时,我仍然获得值1到5,但是有时我也得到NULL。NULL经常出现,大约五分之一。如果我将两个查询都放入ssms中并彼此相邻运行几次,则通常会看到第二个查询为空值,但第一个查询永远不会为NULL。

那为什么呢?这些计算不完全相同吗?我不知道为什么这两个查询会给出不同的结果,但是我觉得我可以通过发现来学习有关T-SQL的有用信息。

任何专家都想启发我吗?

答案1

小编典典

这是chooseSQL
Server中功能的一个非常微妙的问题(好吧,Microsoft可能会将其视为功能)。该函数实际上是case表达式的简写形式。所以,你的表情:

select CHOOSE(CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) +1,''One'',''Two'',''Three'',''Four'',''Five'')

转换为:

select (case when CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) + 1 = 1 then ''One''             when CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) + 1 = 2 then ''Two''             when CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) + 1 = 3 then ''Three''             when CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) + 1 = 4 then ''Four''             when CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) + 1 = 5 then ''Five''        end)

这意味着newid()多次被调用。这通常不是您想要的行为。

c – 模运算符给出不同的结果与前导零

c – 模运算符给出不同的结果与前导零

参见英文答案 > How does C Handle Integer Literals with Leading Zeros,and What About atoi?7个
为什么:
int test() {
    return 00101 % 10;
}

返回5,而:

int test() {
    return 101 % 10;
}

返回1?我不能想到一个解释.

解决方法

以0开头的整数文字
00101

实际上是八进制常数.

c# – Linq查询给出不合适的输出

c# – Linq查询给出不合适的输出

我有两个名为ParentTransaction和ChildTransaction的事务表,其中ParentTransaction的TransactionId将作为TransactionId的ChildTransaction的外部事务.

现在我想得到所有那些未完成payamount的ParentTransaction的TransactionId.

从下面的输出我想要事务Id 3的记录,因为只有1000支付了transactionid 3而不是5000.

我有一个这样的表:

Transactionid(p.k)    PayAmount
  1                   1000
  2                   3000
  3                   5000
  4                   6000

ChildTransaction

Id        TransactionId(F.k)   DepositAmount
1           1                  600
2           1                  400
3           2                  1000
4           2                  1000
5           2                  1000
6           3                  2000

这是我的查询:

var data = (from tmp in context.ParentTransaction
            join tmp1 in context.ChildTransaction on tmp.Transactionid equals
            tmp1.Transactionid where tmp.PayAmount !=tmp1.DepositAmount
                    select tmp);

但在这里我得到了交易ID 1和2,尽管他们的交易已经完成了两个部分,即600和400的交易ID 1.

解决方法

查询语言的一般概念是表达所需的结果,而不是如何获得它.

将它应用于您的场景会导致这样的简单查询

var query = context.ParentTransaction
   .Where(t => t.PayAmount != context.ChildTransaction
      .Where(ct => ct.TransactionId == t.TransactionId)
      .Sum(ct => ct.DepositAmount));

如果您使用EF和正确的模型导航属性,它甚至会很简单

var query = context.ParentTransaction
    .Where(t => t.PayAmount != t.ChildTransactions.Sum(ct => ct.DepositAmount));

可以说,与@Vadim Martynov的回答相比,上述内容效率低下.好吧,可能是的,可能不是. Vadim试图强制执行一个特定的执行计划,我可以理解 – 当实际遇到查询性能问题时,我们必须做这些事情.但这并不自然,只有在我们遇到性能问题时才应该是最后的手段.在大多数情况下,查询提供程序和SQL查询优化器将为我们执行(并且正在执行)该工作,因此我们不需要考虑是否需要使用连接与子查询等.

java – 如何在hql或jpql查询中查询两个不同的数据库(在不同的服务器上)?

java – 如何在hql或jpql查询中查询两个不同的数据库(在不同的服务器上)?

我想使用hql或jpql在两个不同的数据库(在具有相同供应商的两个不同的数据库引擎)上的两个表上编写查询?
      mysql ServerA上的databaseA中的tblA
    MysqL ServerB上的databaseB中的tblB
有什么解决方案?

解决方法

基本上你必须得到两个会话工厂 – 每个数据库一个(数据源).我找到了以下代码: http://www.java-forums.org/jdbc/867-hibernate-multiple-databases.html应该可以解决这个问题.

public class HibernateUtil {

    private static Log log = LogFactory.getLog(HibernateUtil.class);
    private static HashMap<String,SessionFactory> sessionFactoryMap = new HashMap<String,SessionFactory>();

    public static final ThreadLocal sessionMapsThreadLocal = new ThreadLocal();

    public static Session currentSession(String key) throws HibernateException {

        HashMap<String,Session> sessionMaps = (HashMap<String,Session>) sessionMapsThreadLocal.get();

        if (sessionMaps == null) {
            sessionMaps = new HashMap();
            sessionMapsThreadLocal.set(sessionMaps);
        }

        // Open a new Session,if this Thread has none yet
        Session s = (Session) sessionMaps.get(key);
        if (s == null) {
            s = ((SessionFactory) sessionFactoryMap.get(key)).openSession();
            sessionMaps.put(key,s);
        }

        return s;
    }

    public static Session currentSession() throws HibernateException {
        return currentSession("");
    }

    public static void closeSessions() throws HibernateException {
        HashMap<String,Session>) sessionMapsThreadLocal.get();
        sessionMapsThreadLocal.set(null);
        if (sessionMaps != null) {
            for (Session session : sessionMaps.values()) {
                if (session.isopen())
                    session.close();
            };
        }
    }

    public static void closeSession() {
        HashMap<String,Session>) sessionMapsThreadLocal.get();
        sessionMapsThreadLocal.set(null);
        if (sessionMaps != null) {
            Session session = sessionMaps.get("");
            if (session != null && session.isopen())
                session.close();
        }
    }

    public static void buildSessionFactories(HashMap<String,String> configs) {
        try {
            // Create the SessionFactory
            for (String key : configs.keySet()) {
                URL url = HibernateUtil.class.getResource(configs.get(key));
                SessionFactory sessionFactory = new Configuration().configure(url).buildSessionFactory();
                sessionFactoryMap.put(key,sessionFactory);
            }

        } catch (Exception ex) {
            ex.printstacktrace(System.out);
            log.error("Initial SessionFactory creation Failed.",ex);
            throw new ExceptionInInitializerError(ex);

        } // end of the try - catch block
    }

    public static void buildSessionFactory(String key,String path) {
        try {
            // Create the SessionFactory
            URL url = HibernateUtil.class.getResource(path);
            SessionFactory sessionFactory = new Configuration().configure(url).buildSessionFactory();
            sessionFactoryMap.put(key,sessionFactory);

        } catch (Throwable ex) {

            log.error("Initial SessionFactory creation Failed.",ex);
            throw new ExceptionInInitializerError(ex);

        } // end of the try - catch block
    }

} // end of the class

LINQ转换与我的SQL查询给出的结果不同

LINQ转换与我的SQL查询给出的结果不同

嗨,大家好,我有这个SQL查询(MSSQL),我正在做一个查询,其中联接的结果按日期提供了最新行的“顶部”行,而没有重复的结果,您可以在此处找到有关我所执行的操作的信息m正在执行http://goo.gl/Uv0FR事情是这样的,我已经完成了SQL查询,正在按预期工作,在子句“
where pi.PlazaIe in (’‘,’‘)不重复

Select * from PlazaI pijoin (    Select * from PlazaE pe where     NOT EXISTS(SELECT 1 FROM PlazaE pe1     WHERE pe.Id_plaza = pe1.Id_plaza AND pe1.Fecha > pe.Fecha AND pe1.Fecha < GETDATE() and pe1.Id_Emp != 0) ) pe on pe.Id_plaza = pieepo.Id_plazajoin Emp e on pe.Id_Emp = e.Id_Empjoin View ct on ct.Id_Nodo = pe.id_nodowhere pi.PlazaIe in (''value1'',''value2'')

问题是当我尝试从SQL转换为LINQ时根本无法实现。(我是Linq的世界中的新人)

以下是我的linq查询。

var q1 = (from pe in db.PlazaEmpleados                where !db.PlazaEmpleados.Any                                    (                                     pe1 => (pe1.Id_plaza.Equals(pe.Id_plaza) && pe1.Fecha > pe.Fecha && pe1.Id_Emp != 0 && pe1.Fecha > DateTime.Now)                                    ) select pe);    var q2 = (from pi in db.Context              join pe in (q1) on pi.Id_plaza equals pe.Id_plaza                select new EmpVO                  {                    Id_Nodo = pe.id_nodo,                    Id_plaza = pi.PlazaSome,                    Num_Plaza = pi.Id_plaza,                  });

当我运行此linq2sql查询时,我得到重复的结果,而不是每个值只有1个。所以问题是,我想知道是否有人可以很好地将SQL查询转换为LINQ查询,或者指出错误在哪里。

提前致谢。

答案1

我没有找到解决问题的答案,所以我最后要做的是使用

db.ExecuteQuery<ObjectVO>(sqlQuery);

我知道这不是最佳做法,也无法解决为什么我的sql查询和linq查询没有得到相同结果集的问题,但是没有上一个答案。

另一件事是我的查询变得越来越复杂(新的业务逻辑要求),必须连接7表并搜索Max日期,并且移动是其中的一些,所以现在将查询转换为linq到sql变得更加复杂。

感谢您的支持。

今天关于在声明整数与计算查询中时,T-SQL查询给出不同的结果的介绍到此结束,谢谢您的阅读,有关c – 模运算符给出不同的结果与前导零、c# – Linq查询给出不合适的输出、java – 如何在hql或jpql查询中查询两个不同的数据库(在不同的服务器上)?、LINQ转换与我的SQL查询给出的结果不同等更多相关知识的信息可以在本站进行查询。

本文标签: