将两个sql查询合并到一个表中
我有两个SQL查询,其中第一个使用内部联接根据条件进行匹配,另一个不使用。最后,我想知道每个查询创建的列之间的差异。我该怎么做 我在一些类似的帖子中尝试过联合和加入查询,但它不起作用。我想知道问题是否围绕着每个查询中的连接 问题1:将两个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
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
。然后,您可以使用onecount()
中的一个大小写来仅计算加入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;