【问题标题】:SQL comparison between 3 columns3列之间的SQL比较
【发布时间】:2014-06-10 08:43:37
【问题描述】:

我的数据库中有 3 列。 (1) 买/卖 (2) ID (3) 日期和时间。例如:

buySel      ID     Date
  1         234    12/12/2014
  1         234    12/12/2014
  2         234    12/12/2014

在buySell 中,数字(1) 表示买入,(2) 表示卖出。在同一天内,如果 ID 例如'234' 被买卖,这应该返回错误消息。

这是我在 C# 中所做的

string connectionString= "connection string goes here";
        string Query = "SELECT COUNT(*) AS sum from databaseTable  WHERE created_time >= DATEADD(hour, 9, CONVERT(DATETIME, CONVERT(DATE, GETDATE())))";
         ........
        SqlDataReader data;
        try
        {

            con.Open();
            myReader = cmdg.ExecuteReader();
            while (data.Read())
            {

                if (myReader[0].ToString() != "0")
                {


                    MessageBox.Show("Error " + myReader[0].ToString());
                }
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }

我设法将它与今天的日期进行了比较,但是如何将它与 buySell 列和 ID 列进行比较?

【问题讨论】:

    标签: c# sql sql-server


    【解决方案1】:

    我不确定您要返回的确切内容。以下将根据同一天的买卖确定您数据中的所有错误:

    select id, date
    from databaseTable t
    group by id, date
    having sum(case when buysel = 1 then 1 else 0 end) > 0 and
           sum(case when buysel = 2 then 1 else 0 end) > 0;
    

    【讨论】:

    • 您使用的日期是与今天的日期相比吗?你有from databaseTable t 't' 代表什么?因为当我执行此查询时,我没有收到任何记录...
    • 这不是与特定日期进行比较。它按日期分组以查找任何日期的错误情况。 't' 是一个表别名,在此查询中不需要,但在我的回答中的查询中非常常见且有用。
    • 但是当我将它放在 SQL server 2012 中时仍然没有结果
    • @user3517479 。 . .我注意到您的问题 使用名为date 的列,但您的代码使用名为created_time 的列。如果您所谓的date 字段具有时间组件,那么您不太可能得到重复项。您需要从中提取日期,通常使用cast(date as date)
    • @GordonLinoff 我也发现了。查看 SQL 示例:DATEADD(hour, 9, CONVERT(DATETIME, CONVERT(DATE, GETDATE()))),它甚至尝试将 DATE 更改为 DATETIME,以便您可以添加 9 小时,然后将其与 DATE 值进行比较。这将有助于了解存储在此表中的日期值及其测试数据的精度。
    【解决方案2】:

    我喜欢@GordonLinoff 的回答,但没有将它与使用 EXISTS 和相关子查询所获得的性能进行比较。

    create table databaseTable (buySel TINYINT, ID INT, [Date] DATE)
    
    insert into databaseTable values 
    (1,234,'12/12/2014'),
    (1,234,'12/12/2014'),
    (2,234,'12/12/2014')
    
    select id
          ,[Date]
      from databaseTable a
     where exists(select 1 from databaseTable b where b.id=a.id 
                                                  and b.[Date] = a.[Date]
                                                  and buysel = 1)
       and exists(select 1 from databaseTable b where b.id=a.id 
                                                  and b.[Date] = a.[Date]
                                                  and buysel = 2)
     group by id
             ,[Date]
    

    在此查询中,group by 仅用作更有效的 DISTINCT。

    编辑:

    由于上述陈述受到质疑,我认为我应该更仔细地检查它。这里和整个网络上有很多讨论。我认为指导的总和是 GROUP BY 通常比 DISTINCT 更有效,但并非总是如此,而且 DISTINCT 是一种更直观的语法。

    Huge performance difference when using group by vs distinct

    When the performance of Distinct and Group By are different?

    http://msmvps.com/blogs/robfarley/archive/2007/03/24/group-by-v-distinct-group-by-wins.aspx

    【讨论】:

    • @GordonLinoff 查询没有返回任何内容
    • 当我对样本数据运行它们时,它们都返回相同的东西。熟悉 sqlfiddle.com?
    • 我不知道这意味着什么。但是sqlfiddle.com/#!6/284e1/1 显示了针对您的示例数据的两个查询。
    • @KarlKieninger 。 . . group bydistinct 通常具有相同的性能配置文件。一些愚蠢的数据库对于distinct 的索引使用可能更聪明,但SQL Server 非常聪明,所以我怀疑group byselect distinct 会生成相同的执行计划。
    • @GordonLinoff 我有很好的权威 GROUP BY out 执行 DISTINCT,因此在返回 1 列或几列时首选。我会看看我是否能找到参考,因为在这种情况下,这将是微不足道的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2016-11-23
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多