Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在单个查询中查找两个不相关表中的计数_Sql_Postgresql_Join_Count_Aggregate Functions - Fatal编程技术网

Sql 在单个查询中查找两个不相关表中的计数

Sql 在单个查询中查找两个不相关表中的计数,sql,postgresql,join,count,aggregate-functions,Sql,Postgresql,Join,Count,Aggregate Functions,以下查询用于计算单个查询中两个不相关表中的行数 With t1 as (Select 1 Union Select 2 Union Select 3), t2 as (Select 'A' Union Select 'B') Select (Select count(*) from t1), (Select count(*) from t2) 是否有更好的方法避免select查询中的两个select

以下查询用于计算单个查询中两个不相关表中的行数

  With t1 as (Select 1 
              Union Select  2 
              Union Select 3),
  t2 as (Select 'A' 
         Union Select 'B')

  Select (Select count(*) from t1), (Select count(*) from t2)
是否有更好的方法避免select查询中的两个select语句

输出应该是

3 2

任何特定于Postgres的构造也可以。

通过添加一个行号列来引入两个表之间的关系,并进行完整的外部联接

  With t1 as (Select 1 as Col1, 1 
              Union Select  2, 2 
              Union Select 3, 3),
  t2 as (Select -1 as Col1, 'A' 
         Union Select -2, 'B')

  Select count(t1.*), count(t2.*) from t1 full outer join t2 on t1.Col1 = t2.Col1

计数是一项极其昂贵的操作(就CPU负载而言)。尽可能避免。如果您需要在没有任何条件的情况下获取表的总行数,一些RDBMS提供了一种解决方法,例如使用MSSQL,它如下所示:

select SUM(row_count) as Total_Rows
 from sys.dm_db_partition_stats
where object_name(object_id) = 'YourTableName' 
  and index_id < 2
选择总和(行数)作为总行数
从sys.dm_db_分区_stats
其中object\u name(object\u id)='YourTableName'
和索引_id<2
另一种方法是将您的计数保存在单独的表中,例如,如果您需要按某个值分组的总数。您可以使用触发器增加和减少计数。如果您(例如)必须始终在主窗体上显示计数(活动用户、每个区域的活动帖子等),建议您这样做。

简单且正确 首先,您可以使用一个表达式来简化测试用例,而不是更详细的
UNION-all-SELECT

如果数据类型不是默认的
integer
text
,则第一行需要显式类型转换

其次,
完全外部联接
是完全没有意义的。它所做的只是使查询速度变慢。如果任何一行在另一个表中有多个匹配项,它将在计数中相乘

WITH t1(col1, col2) AS (VALUES (1, 1),   (2, 2),   (3, 3))
    ,t2(col1, col2) AS (VALUES (1, 'A'), (2, 'B'), (2, 'C'))  -- 2nd row for "2"
SELECT count(t1.*), count(t2.*)
FROM t1
FULL OUTER JOIN t2 USING (col1);
收益率:

4   3
3   3
这是错误的

收益率:

4   3
3   3
这是正确的,而且更简单更快。
诚然,新应用的
row_number()
不会有重复,但这只是浪费时间

演出 大型表格的计数速度相对较慢。如果您不需要精确的计数,但可以接受估计值,则可以非常快地得到:

SELECT reltuples::bigint AS estimate
FROM   pg_class
WHERE  oid = 'myschema.mytable'::regclass;
我引述:

它通过VACUUM、ANALYZE和一些DDL命令(如 创建索引


一旦它们是不相关的(正如你所说的)-执行单个查询没有错。1个查询而不是2个查询既不好也不快。你需要它来为mysql或postgres工作吗?因为我认为mysql甚至不能做类似于“使用As(选择…)”的事情@虫族:只是想知道可用于此目的的替代方法。@Gopal:没有理由。表是不相关的。执行2queries@zerkms当前位置首先,这不是“不成熟”,而是他自己的建议。其次,我的评论包括一句有条件的句子:如果他想把它们放在一行,他最好执行一个查询。第三:对于他想要实现的目标,有三种解决方案:他发布的解决方案或两个计数的并集。这些解决方案返回一个结果集。第三种解决方案将返回两个结果集,然后一个接一个地执行这两个计数。只要我们不知道结果是如何处理的,这三种可能性都是相同的就复杂性而言,不是吗?如果列
Col1
是两个表之间的人工连接,我不建议使用此解决方案。它引入了完全不必要的联接操作。坚持使用您的解决方案,这是完全正确的。我想添加:使用
select(count(*)选择,坚持使用原始解决方案。。。,(选择计数(*)…)
Hi alzaimar,我之所以选择一个查询,是因为我需要在原始问题中添加几个谓词。如果我保留两个单独的查询,那么我需要在两个表中复制这些谓词。虽然问题陈述说表是不相关的,但它们并非完全不相关。为了简化情况,我提到这个例子。无论如何,谢谢你的建议。谢谢alzaimar。我的问题1的这个解决方案的局限性。这些表不是持久的。(它们只是CTE)2.对于我来说,创建一个用于计数和维护触发器的新表是过度工程化的,因为在不久的将来负载不会这么大。没问题。祝你新年快乐。感谢alzaimar,并祝你也一样。嗨,Erwin,感谢你的详细回复。值表达式非常酷,非常有用。此外,两个表中的col1都是通用的这只是为了链接两个表,因此该列中不会有重复项。此外,问题本身也提到了计算单个表的数量。我们期望找到一种替代方法。您提出的计算估算数量的建议非常棒。但是,在我的情况下,我需要找到准确的数量。我总而言之,再次感谢您的详细回复,它提供了非常丰富的信息。@Gopal:没有比单独计算两张表更好的选择。