是否可以在 SQL 中反转 select 语句?
Posted
技术标签:
【中文标题】是否可以在 SQL 中反转 select 语句?【英文标题】:Is it possible to inverse the select statement in SQL? 【发布时间】:2017-03-03 11:24:57 【问题描述】:当我想选择除 foo 和 bar 之外的所有列时,我通常所做的只是在 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
强制您使用的范围变量名称t1
和t2
后缀。
鉴于:
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条件语句?