简体   繁体   中英

How can I find out the relationship between two columns in database?

I have a view defined in SQL Server database and it has two columns A and B, both of which have the type of INT. I want to find out the relationship between these two, 1 to 1 or 1 to many or many to many . Is there a SQL statement I can use to find out?

For the relationship, it means for a given value of A, how many values of B maps to this value. If there is only one value, then it is 1 to 1 mapping.

You could use CTE s to generate COUNT s of how many distinct A values were associated with each B value and vice versa, then take the MAX of those values to determine if the relationship is 1 or many on each side. For example:

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

Note that any time a relationship is listed as 1 , it may actually be many but just not showing that because of limited data in the table.

Demo on dbfiddle

You would use count and group by to get this information.

--This would give you count of values of b which map to every values of a. If there is at least one row with a count give you a value greater than 1 it means the mapping between a and b is one to many.

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

If all of the rows have the values equal to one for all of the elements in a then the mapping is one-one

A caveat , null in b would be ignored in count expressions. ie because null and another null is not equivalent

Assuming you have no NULL values:

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;

Note: This does not distinguish between 1-many for a-->b or b-->a.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM