Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 server 如何有效地检查同一表中的两列是否为一对一映射?_Sql Server - Fatal编程技术网

Sql server 如何有效地检查同一表中的两列是否为一对一映射?

Sql server 如何有效地检查同一表中的两列是否为一对一映射?,sql-server,Sql Server,即使不同的值计数相等,也不一定意味着一对一的映射关系 SELECT COUNT(DISTINCT [Column_A]) FROM MyTable SELECT COUNT( DISTINCT [Column_B]) FROM MyTable -- Check Column A value which DOES NOT maps to exactly 1 Column_B value SELECT Column_A, COUNT(Column_B) FROM MyTable GROUP B

即使不同的值计数相等,也不一定意味着一对一的映射关系

SELECT COUNT(DISTINCT [Column_A]) FROM MyTable 
SELECT COUNT( DISTINCT [Column_B]) FROM MyTable 
-- Check Column A value which DOES NOT maps to exactly 1 Column_B value
SELECT Column_A, COUNT(Column_B) FROM MyTable GROUP BY Column_A HAVING COUNT(Column_B) > 1

-- Check Column B value which DOES NOT maps to exactly 1 Column_A value
SELECT Column_B, COUNT(Column_A) FROM MyTable GROUP BY Column_B HAVING COUNT(Column_A) > 1
A栏:123456789101
B列:a B c d e f g h i j

上面的查询为每列返回10的值,但它们不是一对一的映射

如何准确地检查此
匹配类型的存在?

提前感谢

您可以测试与Group By的一对一关系

SELECT Column_A, Column_B FROM MyTable GROUP BY Column_A, Column_B

SELECT Column_A FROM MyTable GROUP BY Column_A

SELECT Column_B FROM MyTable GROUP BY Column_B 

上述三个查询的结果计数应相同。

此查询将显示[Column_A]的任何值,其中[Column_B]有多个值。如果它不返回任何行,则为1对1关系

select [Column_A], count([Column_B]) as not_distinct
from (select [Column_A], [Column_B] from MyTable
      group by [Column_A], [Column_B]) subtable
group by [Column_A]
having count([Column_B]) >1;

假设所有值都不是
NULL
。查询结果显示该值违反了1对1关系

SELECT COUNT(DISTINCT [Column_A]) FROM MyTable 
SELECT COUNT( DISTINCT [Column_B]) FROM MyTable 
-- Check Column A value which DOES NOT maps to exactly 1 Column_B value
SELECT Column_A, COUNT(Column_B) FROM MyTable GROUP BY Column_A HAVING COUNT(Column_B) > 1

-- Check Column B value which DOES NOT maps to exactly 1 Column_A value
SELECT Column_B, COUNT(Column_A) FROM MyTable GROUP BY Column_B HAVING COUNT(Column_A) > 1
使用
+


如果count返回一些值,则表示它们不是1:1映射其他方面,两列都具有唯一对

我根据一对一映射的定义使用了此查询

WITH FREQ AS (
SELECT COUNT(DISTINCT  [Column_B]) AS Freq  FROM MyTable GROUP BY 
[Column_A])
SELECT DISTINCT Freq  FROM FREQ 
ORDER BY Freq DESC

WITH FREQ AS (
SELECT COUNT(DISTINCT  [Column_A]) AS Freq  FROM MyTable GROUP BY 
[Column_B])
SELECT DISTINCT Freq  FROM FREQ 
ORDER BY Freq DESC

非常感谢,所有天才们,感谢你们的优秀想法。

最重要的答案和公认的答案都是错误的!我来这里是想在一个查询中找到这样做的方法,但我不确定它是否存在。如果不能做到这一点,我认为这是最简单的答案,它将检查它是否是一对一的关系(答案不要求任何关于非一对一值的信息,只要求列是否是一对一):


如果这两个查询都返回零行,那么您知道
列A
的每个值只映射到
列B
的一个值,
列B
的每个值映射到
列A
的一个值,因此它们定义为一对一。

这不是一个不同的计数。此
计数(不同的[Column_A])
是一个不同的计数。上面的两个查询都只计算表中的记录数,而不是唯一的值。这是什么意思。匹配类型?@reds一对一映射请提供一些详细的示例、表格以及一些测试数据和预期结果。目前您的问题非常不清楚。这不可能一对一映射,因为您的数据已经是一个计数,您的查询将返回所有数字。这正好证明这是一个多对一的关系!您可以考虑一个具有两行和两列的表,其中第一列具有值[a,'b' ],而第二列具有值[c','c'],看看为什么。此查询将给出“A”和“B”在第二列中各有一个不同的值,因此不会返回任何行,但显然不是一对一。此答案对于所问问题不正确,这将标记任何在任一列中出现多次的值,即使该值与另一列有一对一。因此,在您的解决方案中,您正在寻找两种情况下FREQ.FREQ的唯一值均为1,对吗?