【问题标题】:Is it possible to inverse the select statement in SQL?是否可以在 SQL 中反转 select 语句?
【发布时间】:2017-03-03 11:24:57
【问题描述】:

当我想选择除 foobar 之外的所有列时,我通常所做的只是在 select 语句中明确列出所有其他列。

select a, b, c, d, ... from ...

但是如果表有十几个列,这对于简单的方法来说是一个乏味的过程。相反,我想做的是类似于以下伪语句:

select * except(foo, bar) from ...

我也想知道,是否有一个函数可以从多个列组成的结果中过滤掉行,如果多行在all对应的内容相同列。换句话说,重复的行将被过滤掉。

------------------------
A     | B      | C      
------------------------    ====>    ------------------------
A     | B      | C                   A      | B      | C
------------------------             ------------------------

【问题讨论】:

  • Q1:第 Q2:SELECT DISTINCT.

标签: mysql sql database select


【解决方案1】:

select * except(foo, bar) from

这是 SO 上经常要求的功能。但是,它还没有达到 SQL 标准,而且我不知道有任何支持它的 SQL 产品。我猜当产品经理要求他们的开发人员、MVP、用户组等衡量对这个预期功能的热情时,他们大多会听到,“SELECT * FROM 被认为是危险的,我们需要保护不知道自己在做什么的新用户等”

您可能会发现使用NATURAL JOIN 而不是INNER JOIN 等很有用,它会从结果表表达式中删除重复的列,例如

SELECT * 
  FROM Table1 t1
       INNER JOIN Table2 t2 
          ON t1.foo = t2.foo
             AND t1.bar = t2.bar;

将导致两列名为foo 和两列名为bar(可能还有其他重复的名称),可能会以某种方式进行重复数据删除,例如通过在INNER JOIN 强制您使用的范围变量名称t1t2 后缀。

鉴于:

SELECT * 
  FROM Table1 NATURAL JOIN Table2;

不需要使用范围变量(一件好事),因为结果中只有一个名为 foo 的列和一个名为 bar 的列。

为了删除重复的行和列,将隐含的SELECT ALL * 更改为显式的SELECT DISTINCT *,例如

SELECT DISTINCT * 
  FROM Table1 NATURAL JOIN Table2;

这样做可能会减少您对SELECT ALL BUT { these columns } 功能的需求。

当然,如果您这样做,您会被告知,“NATURAL JOIN 被认为是危险的,我们需要保护您免受自己的伤害,以防您不知道自己在做什么等。” :)

【讨论】:

    【解决方案2】:

    您可以查询INFORMATION_SCHEMA db 并获取该表的列列表(除了两个),例如:

    SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<foo,bar>,', '') 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = '<your_table>' AND TABLE_SCHEMA = '<database>';
    

    获得列列表后,您可以在选择查询中使用它。

    【讨论】:

      【解决方案3】:

      您可以基于此表创建除这两列之外的所有列的视图,然后每次都使用此视图

      select * from view
      

      所有列上的简单分组将删除此类重复项。还有其他选项 - distinct 和 row_number。

      【讨论】:

      • 我理解不能进行反向选择的限制,因为这会破坏数据库和客户端应用程序之间的合同。每个查询都可能返回完全不同的结果。但这将是快速观察表格的便捷功能。在视图创建中,您必须为这个简单的平均值做更多的工作,并且不适合。
      • 好的。我的假设是您多次使用没有这些列的特定表。这将通过该 sql 的可重用性来减少您的工作量。
      猜你喜欢
      • 1970-01-01
      • 2017-01-16
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      相关资源
      最近更新 更多