【问题标题】:Returning more than one value from a sql statement从 sql 语句返回多个值
【发布时间】:2008-12-20 01:03:35
【问题描述】:

我正在查看 sql 内部查询(有点像 C# anon 方法的 sql 等效项),并且想知道,我可以从查询中返回多个值吗?

例如,将表中的行数作为一个输出值返回,并且作为另一个输出值,返回不同的行数?

另外,distinct 是如何工作的?这是基于一个字段是否可能与另一个字段相同(因此被归类为“不同”)?

我使用的是 Sql Server 2005。如果我从一个查询返回一个值,而不是从一个查询返回两个值,是否会降低性能?

谢谢

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    你可以这样做来回答你的第一个问题:

    SELECT
      COUNT(field1),
      COUNT(DISTINCT field2)
    FROM table
    

    (对于第一个字段,如果需要计算空值,您可以*。)

    Distinct 表示这个词的定义。它消除了重复的返回行。

    返回 2 个值而不是 1 个将取决于这些值是什么、它们是否被索引以及其他未确定的可能变量。

    如果您是指 select 语句中的子查询,则您只能返回 1 个值。如果您想要超过 1 个值,则必须使用子查询作为连接。

    【讨论】:

      【解决方案2】:

      如果内部查询在 SELECT 中是内联的,您可能很难选择多个值。但是,通常可以将JOIN 改为子查询;这样子查询就可以命名,并且可以得到多个结果

      SELECT a.Foo, a.Bar, x.[Count], x.[Avg]
      FROM a
      INNER JOIN (SELECT COUNT(1) AS [Count], AVG(something) AS [Avg]) x
        ON x.Something = a.Something
      

      这可能会有所帮助。

      DISTINCT 按照它所说的去做。 IIRC,你可以SELECT COUNT(DISTINCT Foo)等查询不同的数据。

      【讨论】:

        【解决方案3】:

        您可以通过 3 种方式返回多个结果(我想不到)

        1. 通过具有多个值的选择,例如:选择 col1、col2、col3
        2. 有多个查询,例如:select 1;选择“2”;选择 colA。您可以通过调用 .NextRecord() 在数据阅读器中找到它们
        3. 使用输出参数,在执行查询之前声明参数,然后从它们获取值。例如:设置 @param1 = "2" 。 string myparam2 = sqlcommand.parameters["param1"].tostring()

        不同,过滤结果行是唯一的。

        【讨论】:

          【解决方案4】:

          表单中的内部查询:

          SELECT * FROM tbl WHERE fld in (SELECT fld2 FROM tbl2 WHERE tbl.fld = tbl2.fld2) 
          

          不能返回多行。当您需要来自辅助查询的多行时,通常需要对另一个查询进行内部联接。

          行数:

          SELECT count(*), count(distinct *) from table 
          

          将返回一个数据集,其中一行包含两列。第 1 列是表中的总行数。第 2 列只计算不同的行。

          不同意味着返回的数据集不会有任何重复的。 Distinct 通常只能在选择后直接出现一次。因此查询如下:

          SELECT distinct a, b, c FROM table 
          

          可能会有这样的结果:

           a1  b1  c1
           a1  b1  c2
           a1  b2  c2
           a1  b3  c2
          

          请注意,值在整个结果集中重复,但每一行都是唯一的。

          我不确定你的最后一个问题是什么意思。您应该从查询中返回与查询相关的所有数据。至于更快,只有基准测试才能告诉您哪种方法更快。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-04-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-21
            • 1970-01-01
            相关资源
            最近更新 更多