4

我是一个完整的 sql 菜鸟,所以我为接下来的 sql 屠戮道歉......这是我正在尝试做的伪代码:

count( 
   join( 
      select( * from table X where a='stuff' and b='junk' ) as X1
      select( * from table X where a='arg' and b='blarg' ) as X2
      select( * from table X where a='narf' and b='foo' ) as X3
   ) where X1.c = X2.c = X3.c
)

是否有可能在一个查询中获得此结果?

4

4 回答 4

2
select count(*) from 

(select * from table X where a='stuff' and b='junk') x1

join

(select * from table X where a='arg' and b='blarg' ) x2

on x1.c=x2.c

join

( select * from table X where a='narf' and b='foo' ) X3

on x2.c=x3.c
于 2012-10-03T18:38:55.520 回答
1

如果我要猜你真正想要什么,那就是“c”的计数,它在aandb列中具有所有三个条件。如果是这种情况,则以下工作:

select count(*)
from (select c
      from table X
      group by c
      having sum(CASE WHEN a = 'stuff' AND b = 'junk' THEN 1 ELSE 0 END) > 0 and
             sum(CASE WHEN a = 'arg' AND b = 'blarg' THEN 1 ELSE 0 END) > 0 and
             sum(CASE WHEN a = 'narf' AND b = 'foo' THEN 1 ELSE 0 END) > 0
     ) t
于 2012-10-03T18:45:30.613 回答
0
SELECT c,
       SUM(CASE WHEN a = 'stuff' AND b = 'junk' THEN 1 ELSE 0 END) AS X1,
       SUM(CASE WHEN a = 'arg' AND b = 'blarg' THEN 1 ELSE 0 END) AS X2,
       SUM(CASE WHEN a = 'narf' AND b = 'foo' THEN 1 ELSE 0 END) AS X3
    FROM table_X
    GROUP BY c
于 2012-10-03T18:39:36.717 回答
0

从表 x

你想要三组记录,每组都是从同一个表中选择的 X

  • X1 过滤表 X 中 a='stuff' 和 b='junk' 的记录
  • X2 过滤表 X 中 a='arg' 和 b='blarg' 的记录
  • X3 过滤表 X 中 a='narf' 和 b='foo' 的记录

到目前为止,我们有三个“逻辑视图”,它们是 X 的独立子集,分别称为 X1、X2、X3

加入 ( ... ) 其中 X1.c = X2.c = X3.c

解释可能有点模棱两可,令人困惑,让我们试试:

从字面上看:c 是表 X 的一个字段的名称

  • 案例A: c 是一个键(唯一约束),那么 X 的每条记录(因此 X1,X2,X3)都有唯一的 c 值,因此不存在 X1.c = X2.c = X3.c 的任何记录; 这种情况下的解决方案就像 ==> SELECT 0 一样简单
  • case B:c 不是键,而是可能包含重复值的字段;我们可以将这种情况分成两种(或更多)可能的解释
    • 案例 B1:我们只想考虑和计算 X1.c = X2.c = X3.c 的那些记录;这包括来自子集 X1、X2、X3 的仅那些在所有其他子集中具有 c 值的记录。
    • 案例 B2:我们要计算 X1.c、X2.c、X3.c 的所有可能组合

所有这些情况似乎都特别奇怪,所以我提出了另一种解释,一种最常见的情况,但并不完全遵循连接的概念:

我们要计算 X1,X2,X3 的并集;
在这种情况下,解决方案是:

SELECT COUNT(*) FROM X
WHERE (a='stuff'AND b='junk') 
   OR (a='arg'  AND b='blarg')
   OR (a='narf' AND b='foo')

警告:我完全理解“联合”与“加入”完全不同,因此如果你真的是指加入,这种解释可能是完全错误的,但探索这种含义的可能性似乎很有用。

于 2012-10-03T18:55:15.203 回答