将两个sql查询合并到一个表中

将两个sql查询合并到一个表中,sql,Sql,我有两个SQL查询,其中第一个使用内部联接根据条件进行匹配,另一个不使用。最后,我想知道每个查询创建的列之间的差异。我该怎么做 我在一些类似的帖子中尝试过联合和加入查询,但它不起作用。我想知道问题是否围绕着每个查询中的连接 问题1: SELECT A.date, COUNT(DISTINCT A.id) FROM A INNER JOIN B ON A.id = B.id AND A.date = B.date AND B.col1 = 'value1' LEFT JOIN C on C.key

我有两个SQL查询,其中第一个使用内部联接根据条件进行匹配,另一个不使用。最后,我想知道每个查询创建的列之间的差异。我该怎么做

我在一些类似的帖子中尝试过联合和加入查询,但它不起作用。我想知道问题是否围绕着每个查询中的连接

问题1:

SELECT A.date, COUNT(DISTINCT A.id)
FROM A
INNER JOIN B
ON A.id = B.id AND A.date = B.date
AND B.col1 = 'value1'
LEFT JOIN C on C.key = A.key
WHERE A.col1 = 'value2'
AND C.category = 'cat1'
GROUP BY 1
ORDER BY 1 DESC
问题2:

SELECT A.date, COUNT(DISTINCT A.id)
FROM A
LEFT JOIN C on C.key = A.key
WHERE A.col1 = 'value2'
AND C.category = 'cat1'
GROUP BY 1
ORDER BY 1 DESC 

一种简单的方法是使用
date
列将这两个查询连接起来,该列在两个查询中都可用:

SELECT x.date, x.cnt, y.cnt, y.cnt - x.cnt
FROM 
(
    SELECT A.date, COUNT(DISTINCT A.id) AS cnt
    FROM A
    INNER JOIN B ON A.id = B.id AND A.date = B.date AND B.col1 = 'value1'
    LEFT JOIN C on C.key = A.key
    WHERE A.col1 = 'value2' AND C.category = 'cat1'
    GROUP BY 1
) AS x 
INNER JOIN (
    SELECT A.date, COUNT(DISTINCT A.id) AS cnt
    FROM A
    LEFT JOIN C on C.key = A.key
    WHERE A.col1 = 'value2' AND C.category = 'cat1'
    GROUP BY 1
) AS y ON x.date = y.date
ORDER BY 1 DESC 
您可能希望根据数据布局调整联接类型:

  • LEFT JOIN
    如果所有日期在第一个子查询中可用,但在第二个子查询中可能丢失
  • 右连接
    如果情况正好相反
  • FULL OUTER JOIN
    如果您想要两端的所有可用日期

如果您选择上述任一选项,当其中一个术语是
NULL
时,您需要使用
COALESCE
来防止减法返回
NULL
,因为
WHERE
子句中的
NULL
排除表达式中使用的
c
的左连接实际上变成了内部连接。因此,您可以直接内部联接
c
和左联接
b
。然后,您可以使用one
count()
中的一个大小写来仅计算加入
b
中的行的实例。从另一个
count()
计数所有事件中减去该值以获得差值

SELECT a.date,
       count(DISTINCT a.id)
       -
       count(DISTINCT CASE
                        WHEN b.id IS NOT NULL THEN
                          a.id
                      END)
       FROM a
            INNER JOIN c
                       ON c.key = a.key
                          AND c.category = 'cat1'
            LEFT JOIN b
                      ON a.id = b.id
                         AND a.date = b.date
                         AND b.col1 = 'value1'
       WHERE a.col1 = 'value2'
       GROUP BY 1
       ORDER BY 1 DESC;

你能定义你所说的“差异”是什么意思吗?1970-Jan-01和1970-Jan-03之间的“差异”要么是“2天”,要么是“是”。您的查询非常相似,可以在单个较短的查询中进行优化。如果您提供示例数据和预期输出,这将有所帮助……注意:在这两个查询中,
WHERE
子句中出现
C.category=…
会破坏
左连接C
(即,它会将其变为
内部连接
)。
SELECT a.date,
       count(DISTINCT a.id)
       -
       count(DISTINCT CASE
                        WHEN b.id IS NOT NULL THEN
                          a.id
                      END)
       FROM a
            INNER JOIN c
                       ON c.key = a.key
                          AND c.category = 'cat1'
            LEFT JOIN b
                      ON a.id = b.id
                         AND a.date = b.date
                         AND b.col1 = 'value1'
       WHERE a.col1 = 'value2'
       GROUP BY 1
       ORDER BY 1 DESC;