是否可以在 SQL 中反转 select 语句?

Posted

技术标签:

【中文标题】是否可以在 SQL 中反转 select 语句?【英文标题】:Is it possible to inverse the select statement in SQL? 【发布时间】: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. 【参考方案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 的可重用性来减少您的工作量。

以上是关于是否可以在 SQL 中反转 select 语句?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以查询 SQL Pivot 报告并将输出连接到另一个 select 语句中?

是否可以将 SELECT 语句中具有重复列值的记录与 SQL 中的另一条记录合并?

SQL语句 select from where中可否嵌入if条件语句?

SQL语句中,子句不能使用列别名问题

是否有任何规则可以在条件/案例表达式中使用sql语句子句的哪一部分?

是否可以在 sql 语句中定义表?