我在想.如果我有一个包含20个(或更多)列名的表,并且我想选择所有这些列,但是这20列中的一列是日期列,并且您想要更改该列的格式,您将如何进行那?这显然不起作用(创建重复的列)
Select *, CONVERT(varchar(100),courseStartDate,111) from EthicsManagement
Run Code Online (Sandbox Code Playgroud)
这是为了避免编写一个select语句,单独选择所有20列并使用该语句转换其中一列
Select xxxx,xxx,xxx,xxx,xx,xx,xxx,xxx,xx,xx,xxx,xxx,xx, CONVERT(varchar(100),courseStartDate,111) from xxx
Run Code Online (Sandbox Code Playgroud) 我有一个包含10列的HIVE表,其中前9列将具有重复行,而第10列不会像CREATE_DATE那样具有创建日期.
例:
如果我今天在表中插入10行,它将把CREATE_DATE作为今天的日期..如果我明天再次插入相同的10行,它将有一个不同的CREATE_DATE,这会产生我使用DISTINCT的问题.
有没有办法根据9列删除重复记录而忽略第10列.
示例:让我们考虑表中有5列.这是由DAYID和MARKETID划分的外部HIVE表.每当除CREATEDATE之外的列(由第1行和第2行引用)相同或者如果行是重复的(如第3行和第4行所引用),它应该保留这些行中的任何一行.它保留哪个并不重要.
COL1 COL2 CREATEDATE DAYID MARKETID
A 1 20131206 20131207 1234
A 1 20131207 20131207 1234
A 1 20131206 20131207 1234
B 1 20131206 20131207 1234
B 1 20131206 20131207 1234
C 2 20131206 20131207 1234
C 2 20131207 20131207 5678
Run Code Online (Sandbox Code Playgroud)
输出---
COL1 COL2 CREATEDATE DAYID MARKETID
A 1 20131206 20131207 1234
B 1 20131206 20131207 1234
C 2 20131206 20131207 1234
C 2 20131207 20131207 5678
Run Code Online (Sandbox Code Playgroud)
谢谢Nates
假设:
WITH t12 AS (SELECT * FROM t1 INNER JOIN t2 ON (t1.id = t2.id))
SELECT * FROM t12
Run Code Online (Sandbox Code Playgroud)
这将失败:
The column 'id' was specified multiple times for 't12'.
Run Code Online (Sandbox Code Playgroud)
现在这是一个大型查询,t1并且t2有很多(+200)列.我不是要列出所有内容:我明确要使用*.
通常我会用这个USING (id)子句解决这个问题,但是SQL Server似乎不支持这个.有任何想法吗?
其他选项是在没有WITH子句的情况下工作- 这有效但使代码的可读性降低.
SO上有很多答案可以列出所有字段.在WITH子句和纯SQL中,这是一个明确的问题.这里和此处的 "排除字段" 和视图之一的相关问题要求非ANSI SQL功能.这个问题是针对纯SQL的,如果SQL Server支持ANSI SQL-92语法,则可能(据我所知).
我有一张桌子,设计非常糟糕(不是我感谢),它以类似于以下的方式存储数据:
[key],[lease_id],[building_name],~20多列数据
对于中心和总部,可以并且将存在lease_id.我被要求找到所有实例,其中建筑物中的租赁数据与总部的数据不匹配相同的租约.
我可以通过自我加入很容易地做到这一点.这里的挑战是有大约20列可供比较,虽然我可以手动输入每一列我想知道是否有更好的方法来做到这一点(这也意味着查询可以在将来使用,考虑到任何表更改).
在语法上荒谬的伪代码 - 我想做一些类似于下面的工作:
select lp.*
from lease_proposal lp
inner join
(
select *
from lease_proposal lp2
where building_id = '001' -- assume 001 is head office for sake of example
) lp2
on lp2.lease_id = lp.lease_id
where lp.* <> lp2.*
Run Code Online (Sandbox Code Playgroud) 我正在尝试这样做SELECT * FROM tbl,但是在20列中,我不希望选择1个特定列.有没有动态的方法呢?只是讨厌在查询中指定19列!
我有一个带有列的表格
a,b,c,d,e,f,g,...,z
Run Code Online (Sandbox Code Playgroud)
是否可以编写一个简单的查询来提供所有列,除非a手动指定所有其他列?
相当于:
Select b,c,d,e,f,g,h,...z
from TableG
Run Code Online (Sandbox Code Playgroud) 我想从公共BigQuery github_repos数据集中选择一切,除了两个记录:author.name 和 difference.old_mode.根据我提出的类似问题,我想我想运行类似的查询
#standardSQL
SELECT * REPLACE ((SELECT AS STRUCT author.* EXCEPT (name)) AS author),
REPLACE ((SELECT AS STRUCT difference.* EXCEPT (old_mode)) AS difference)
FROM `bigquery-public-data.github_repos.commits`
LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)
如果我运行作者排除,它运作良好:
#standardSQL
SELECT * REPLACE ((SELECT AS STRUCT author.* EXCEPT (name)) AS author)
FROM `bigquery-public-data.github_repos.commits`
LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)
但是,差异排除有一个错误:
#standardSQL
SELECT * REPLACE ((SELECT AS STRUCT difference.* EXCEPT (old_mode)) AS difference)
FROM `bigquery-public-data.github_repos.commits`
LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)
错误:
Dot-star is not supported for type ARRAY<STRUCT<old_mode INT64, new_mode INT64, old_path STRING, ...>> at [2:41]
Run Code Online (Sandbox Code Playgroud)
谢谢. …
我需要从我的表中的107列中选择90列.
是否可以编写select * except( column1,column2,..) from table或以任何其他方式获取特定列,或者我需要在select语句中写入所有90列?
我有以下查询,我想RowNum从结果中排除列,我该怎么办?
SELECT *
FROM
(SELECT
ROW_NUMBER() OVER ( ORDER BY [Report].[dbo].[Reflow].ReflowID ) AS RowNum, *
FROM
[Report].[dbo].[Reflow]
WHERE
[Report].[dbo].[Reflow].ReflowProcessID = 2) AS RowConstrainedResult
WHERE
RowNum >= 100 AND RowNum < 120
ORDER BY
RowNum
Run Code Online (Sandbox Code Playgroud)
谢谢.