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

时间:2016-10-21 08:24:38

标签: mysql sql database select

当我想选择期望 foo bar 的所有列时,我通常只是在select语句中明确列出所有其他列。

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

但如果表有十几列,这对于简单的方法来说是繁琐的过程。我想做的是类似下面的伪语句:

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

我还想知道,如果有一个函数来过滤掉由多个列组成的结果中的行,那么如果多行在所有中都有相同的内容列。换句话说,将过滤掉重复的行。

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

3 个答案:

答案 0 :(得分: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>';

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

答案 1 :(得分:1)

您可以根据此表创建包含除这两列之外的所有列的视图,然后每次使用此视图

select * from view

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

答案 2 :(得分:0)

  

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(可能还有其他重复名称),可能会以某种方式重复删除,例如通过为t1迫使您使用的范围变量名t2INNER JOIN添加后缀。

鉴于:

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被认为是危险的,我们需要保护你自己,以防你不知道自己在做什么,等等。” :)