【问题标题】:How can I get the member columns of a primary key in SQL Server, sorted by priority in order query result?如何获取 SQL Server 中主键的成员列,按顺序查询结果排序?
【发布时间】:2018-04-22 04:29:37
【问题描述】:

在 SQL Server 中,我得到了一些具有多列主键的表。我使用此查询来获取表中主键的列:

SELECT * 
FROM
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
WHERE 
    Col.Constraint_Name = Tab.Constraint_Name
    AND Col.Table_Name = Tab.Table_Name
    AND Constraint_Type = 'PRIMARY KEY'
    AND Col.Table_Name = 'Code Field Information'

此查询返回三列,即主键的成员。但是当我在表“代码字段信息”中执行查询时,没有 Order 子句,结果中的排序与上面的查询不同。是否可以按排序优先级顺序获取主键的列?

【问题讨论】:

  • 今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
  • ,而不是字段。
  • 你想ORDER BY?如果是这种情况,您可以将 ORDER BY <columnname> ASC 按升序排序或将 DESC 按降序排序。
  • 如果不使用“Order”,SQL 不保证对结果进行排序。我的意思是,相同的查询可以在不同的时间以不同的顺序返回结果。

标签: sql sql-server tsql constraints information-schema


【解决方案1】:

嗯,这种方式返回的结果按照他的优先级排序主键的成员。

SELECT i.name AS IndexName, OBJECT_NAME(ic.OBJECT_ID) AS TableName, COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
    FROM sys.indexes AS i
    INNER JOIN sys.index_columns AS ic
    ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
    WHERE i.is_primary_key = 1 AND OBJECT_NAME(ic.OBJECT_ID)  = 'Code Field Information'

【讨论】:

    【解决方案2】:

    您需要对结果进行排序以保证每次都保持相同。我看到您有名为 Constraint_Type 的列,从您的示例中我假设它是主键并且是唯一的。任何唯一的值(并且会随着时间的推移保持不变)都是很好的候选值。

    如果是这样,我们将使用该列对结果进行排序。

    所以你的查询应该看起来像(这不是最好的查询语法,但它最接近你的)

    SELECT * 
    FROM
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
        INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
    WHERE 
        Col.Constraint_Name = Tab.Constraint_Name
        AND Col.Table_Name = Tab.Table_Name
        AND Constraint_Type = 'PRIMARY KEY'
        AND Col.Table_Name = 'Code Field Information'
    ORDER BY Constraint_Type 
    

    您也可以使用ORDER BY Constraint_Type DESC 进行反向排序。现在,无论您查询多少次,您的结果都将相同。 Ofc,如果你的数据没有改变,那就是。

    如果您计划经常使用它并需要它快速,您应该考虑为该列的该表添加索引。

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      相关资源
      最近更新 更多