我正在尝试链接两个具有相似列的表。我需要找出 table1.column1 和 table 2.column1 有多少值不同:
我当前的查询:
SELECT i10_descr.i10_code, gems_pcsi9.i10_code
FROM i10_descr INNER JOIN gems_pcsi9 ON i10_descr.i10_code = gems_pcsi9.i10_code
ORDER BY i10_descr.i10_code;
我知道这个查询显示了每个表的匹配代码:我不知道如何计算表中丢失/不同的代码。
此外,我还必须计算代码的比率。
非常感谢任何帮助、提示或指导。
谢谢
最佳答案
您可以使用反连接模式来获取一个表中存在的 i10_code 列表,但另一个表中不存在。例如:
SELECT i.i10_code
FROM i10_descr i
LEFT
JOIN gems_pcsi9 g
ON g.i10_code = i.i10_code
WHERE g.i10_code IS NULL
ORDER BY i.i10_code
如果您只想要计数,可以在 SELECT 列表中使用 COUNT(i.i10_code)
和/或 COUNT(DISINCT i.i10_code)
并删除ORDER BY 子句。
要获取 gems 表中不在 i10 表中的 i10_code,您需要执行相同的操作,但反转查询,以便 gems 成为“驱动”表。例如
SELECT COUNT(DISTINCT g.i10_code) AS cnt_diff
FROM gems_pcsi9 g
LEFT
JOIN i10_descr i
ON i.i10_code = g.i10_code
WHERE i.i10_code IS NULL
如果您想合并差异数量,可以通过将两个查询设为内联 View 来合并这两个查询:
SELECT d.cnt_diff + e.cnt_diff AS total_diff
FROM (
SELECT COUNT(DISTINCT g.i10_code) AS cnt_diff
FROM gems_pcsi9 g
LEFT
JOIN i10_descr i
ON i.i10_code = g.i10_code
WHERE i.i10_code IS NULL
) d
CROSS
JOIN (
SELECT COUNT(DISTINCT i.i10_code) AS cnt_diff
FROM i10_descr i
LEFT
JOIN gems_pcsi9 g
ON g.i10_code = i.i10_code
WHERE g.i10_code IS NULL
) e
注意:COUNT 聚合将省略 NULL 值。如果您还想“计算” i10_code 具有 NULL 值的行,则需要调整查询。如果您只需要多个不同的不同值,则可以使用 COUNT(DISTINCT )
。 COUNT()
将给出行数。如果多行具有相同的 i10_code
值,这两个结果将会不同。
为了获得代码的“比率”,假设此时“差异”并不重要,您可以从每个表中获得代码的计数。可以使用内联 View 执行此操作的查询:
SELECT d.cnt / e.cnt AS ratio_cnt_g_over_cnt_i
, d.cnt AS cnt_g
, e.cnt AS cnt_i
FROM (
SELECT COUNT(DISTINCT g.i10_code) AS cnt
FROM gems_pcsi9 g
) d
CROSS
JOIN (
SELECT COUNT(DISTINCT i.i10_code) AS cnt
FROM i10_descr i
) e
关于mysql - 将 INNER JOIN 查询与不同值的计数相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23483249/