如何找出数据库中两列之间的关系



我在SQL Server数据库中定义了一个视图,它有两列a和B,这两列的类型都是INT。我想找出这两者之间的关系,1 to 11 to manymany to many。有没有SQL语句可以用来查找?

对于关系,它意味着对于给定的a值,有多少B值映射到该值。如果只有一个值,那么它就是1到1的映射。

您可以使用CTEs来生成COUNTs,即有多少不同的A值与每个B值相关联,反之亦然,然后取这些值中的MAX来确定每侧的关系是1还是多。例如:

WITH CTEA AS (
SELECT COUNT(DISTINCT B) ac
FROM t
GROUP BY A
),
CTEB AS (
SELECT COUNT(DISTINCT A) bc
FROM t
GROUP BY B
)
SELECT CONCAT(
CASE WHEN MAX(bc) = 1 THEN '1' ELSE 'many' END,
' to ',
CASE WHEN MAX(ac) = 1 THEN '1' ELSE 'many' END
) AS [A to B]
FROM CTEA
CROSS JOIN CTEB

请注意,任何时候一个关系被列为1,它实际上都可能是many,但由于表中的数据有限,因此没有显示出来。

dbfiddle 演示

假设没有NULL值:

select (case when count(*) = count(distinct a) and
count(*) = count(distinct b)
then '1-1'
when count(*) = count(distinct a) or
count(*) = count(distinct b)
then '1-many'
else 'many-many'
end)
from t;

注意:这并不区分a-->b或b-->a的1-many。

您可以使用count和group-by来获取这些信息。

--这将为您提供映射到a的每个值的b的值的计数。如果至少有一行的计数为大于1的值,则意味着a和b之间的映射是一对多的。

select a,count( distinct b)
from table
group by a

如果所有行的值都等于中所有元素的值,则映射为一个

需要注意的是,在计数表达式中将忽略b中的null。ie,因为null和另一个null不是等价的

最新更新