当前位置: 首页 > 面试题库 >

查询以确定是否在数据库中的其他任何地方引用了外键

庄浩言
2023-03-14
问题内容

我想返回此表中的所有内容+一列,该列表示是否在其他任何地方将记录作为外键引用。

IE:

Animal_Id    Name  
    1        Cat
    2        Dog
    3        Parrot

我要退货:

AnimalId    Name     Referenced 
    1        Cat         true
    2        Dog         false
    3        Parrot      true

“引用”是指是否在数据库的任何其他表中将特定的Animal_Id作为外键引用了。我想我首先可以查询information_schema并找出哪些表包含此外键,然后使用循环和动态sql执行
select count(*) from eachTable where AnimalID = 1

有人有摘录该怎么做吗?


问题答案:

这应该做到这一点:

SELECT OO.Animal_ID, OO.Name, CASE WHEN XX.REFERENCED IS NULL THEN 'false' ELSE 'true' END Referenced
FROM   Animal OO
       OUTER APPLY (SELECT SUM(1) REFERENCED
                    FROM   (SELECT FkAnimal_ID FROM AnimalRef1 RR WHERE RR.FkAnimal_ID = OO.Animal_ID UNION ALL
                            SELECT FkAnimal_ID FROM AnimalRef2 RR WHERE RR.FkAnimal_ID = OO.Animal_ID UNION ALL
                            SELECT FkAnimal_ID FROM AnimalRef3 RR WHERE RR.FkAnimal_ID = OO.Animal_ID) II) XX

如果您不了解所有FK表,则可以使用系统元数据表将UNION ALL查询的集合生成到表中,然后可以将其复制并粘贴到查询中:

WITH AKT AS ( SELECT f.name AS ForeignKey
                    ,OBJECT_NAME(f.parent_object_id) AS TableName
                    ,COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName
                    ,OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName
                    ,COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
              FROM   sys.foreign_keys AS f
                     INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
              WHERE  f.referenced_object_id = object_id('Animal'))
SELECT 'SELECT ' + ColumnName + ' FROM ' + TableName + ' WHERE  RR.' + ColumnName + ' = OO.' + ReferenceColumnName + ' UNION ALL'
FROM   AKT

对于使用递归CTE的单个查询中的全部内容:

DECLARE @QUERY NVARCHAR(MAX)

WITH AKT AS ( SELECT ROW_NUMBER() OVER (ORDER BY f.name) RN, f.name AS ForeignKey
                    ,OBJECT_NAME(f.parent_object_id) AS TableName
                    ,COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName
                    ,SCHEMA_NAME(oo.schema_id) SchemaName
                    ,OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName
                    ,COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
              FROM   sys.foreign_keys AS f
                     INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
                     INNER JOIN sys.objects oo ON oo.object_id = fc.referenced_object_id
              WHERE  f.referenced_object_id = object_id('Animal'))

    ,bs AS (SELECT AKT.RN
                  ,'SELECT ' + ColumnName + ' FROM ' + SchemaName + '.' + TableName + ' WHERE ' + ColumnName + ' = OO.' + ReferenceColumnName  SubQuery
            FROM   AKT)
    ,re AS (SELECT bs.RN, CAST(RTRIM(bs.SubQuery) AS VARCHAR(MAX)) Joined
            FROM   bs
            WHERE  bs.RN = 1
            UNION  ALL
            SELECT bs2.RN, CAST(re.Joined + ' UNION ALL ' + ISNULL(RTRIM(bs2.SubQuery), '') AS VARCHAR(MAX)) Joined
            FROM   re, bs bs2 
            WHERE  re.RN = bs2.RN - 1 )
    ,fi AS (SELECT ROW_NUMBER() OVER (ORDER BY RN DESC) RNK, Joined
            FROM   re)
SELECT @QUERY  = 'SELECT OO.Animal_ID, OO.Name, CASE WHEN XX.REFERENCED IS NULL THEN ''No'' ELSE ''Yes'' END Referenced
FROM   Animal OO
       OUTER APPLY (SELECT SUM(1) REFERENCED
                    FROM   (' + Joined + ') II) XX'
FROM   fi
WHERE  RNK = 1

EXEC (@QUERY)


 类似资料:
  • 问题内容: 他(@Mack)使用T-SQL和DMV完成了类似的回答。 如果可能的话,这可能吗? 我会将其发布为评论,但是我还没有足够的声誉… 问题答案: 您可以但不使用DMV,但需要一个相关的动态管理 功能 (DMF) 这是代码: 这是指向DMV和DMF的MSDN页面的链接。

  • 问题内容: 给定一个#,我如何发现可以在哪个表和列中找到它? 我不在乎它是否很快,它只需要工作即可。 问题答案: 这是来自上面链接的Stored Proc-我所做的唯一更改是用temp表替换了一个表变量,因此您不必记住每次都将其删除。

  • 我想知道是否有一种方法可以确定在数据库上启用了PostGis。 我试图用我的开发机器复制我的正式服,我不确定我的开发机器上的数据库是否启用了PostGIS或postgis_topology或两者兼而有之。 我试着四处寻找解决方案,但什么也想不出。 这方面的任何建议都会有帮助。

  • 我有一个字符串列表,这些字符串将作为列作为SQL Select语句的一部分。以及另一个字符串列表,这些字符串表示要在SQL查询中联接的表。 连接条件用XML表示,如下所示。 我已经解组了XML,并且我有代表上述XML的自定义Join对象列表。 在这些列表的帮助下,我创建了SQL select语句。但在某些情况下,该查询与MySQL和Postgres不兼容。我想支持所有数据库。如何使用JOOQ和这种

  • 我刚开始冬眠,所以这个问题可能看起来很愚蠢。 由:org.hibernate.queryException:无法解析属性:Application of:xx.xx.xx.xx.xx.compilation[FROM xx.xx.xx.xx.compilation c,其中c.Application.id=:applicationid]在org.hibernate.queryexception.ge

  • 我目前正在安装Firebase应用程序,并能够检索使用该应用程序的所有用户的列表。当用户首次注册该应用程序时,他们需要确认自己的电话号码,就像现在大多数iOS应用程序一样。我正在“用户”节点中存储他们的电话号码。我的问题是如何在Firebase中查询以查看该电话号码是否存在于我的数据库中?基本上,我想根据我生成的电话号码列表和所有联系人列表进行查询 这将允许我显示特定联系人当前是否正在使用该应用程