sql 查询排除一个字段的其他字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 查询排除一个字段的其他字段相关的知识,希望对你有一定的参考价值。

假设user表有100个字段,其中的password(密码)字段是不能查询到的,那么如何查询其他的99个字段,(总不能99个字段都一一列举出来吧)?

1、创建测试表,此处以创建6个字段为例,实际100个字段的话,操作类似,

create table test_sel_cols(id number, password varchar2(200), remark1 varchar2(100), remark2 varchar2(100), remark3 varchar2(100), remark4 varchar2(100));

2、通过系统视图,查看表结构;可以看到新建表的所有字段;

select * from user_tab_cols t where table_name = 'TEST_SEL_COLS';

3、编写sql,从视图中获取去掉password的所有字段;

   select 'select '||listagg(column_name, ',') within group(order by column_id) ||' from TEST_SEL_COLS' str  from user_tab_cols t where table_name = 'TEST_SEL_COLS' and column_name <> 'PASSWORD';

 

4、将上步查询结果复制出,即可生成所需sql如下:

select ID, REMARK1, REMARK2, REMARK3, REMARK4 from TEST_SEL_COLS

可以发现少了password字段;

参考技术A

用视图代替要查询的表,视图中字段任选

参考技术B 如果想一句话写出来的话,只有将99个字段一一列举出来.
但是可以使用动态语句来 偷下懒
DECLARE @cols AS VARCHAR(4000)
SELECT @cols = isnull(@cols,'') + NAME +',' FROM syscolumns s
WHERE 1=1 AND id = (SELECT id FROM sysobjects WHERE NAME ='yourtable') --and name <> '这里填写你徐压迫排除的字段'
SET @cols = LEFT(@cols,LEN(@cols)-1 )
EXEC ('select ' + @cols + ' from yourtable')
--备注:这个是tsql代码,只针对mssql
参考技术C 你想要的这种写法是不存在的,查询语句的查询列表只有两种情况:
1.select * from [tablename] --查询所有列
2.select a, b, c from [tablename] --查询指定的列
参考技术D 没能明白你的意思.............

不能直接查询表的信息吗?

select
* from user_col_comments
where table_name = upper( '某表名 ');

将行插入 MySQL 表结果从查询到一个字段,SQL 函数返回值到其他字段

【中文标题】将行插入 MySQL 表结果从查询到一个字段,SQL 函数返回值到其他字段【英文标题】:Insert row into MySQL table result from query into one field and SQL function returned values into other fields 【发布时间】:2017-06-05 16:05:45 【问题描述】:

是否可以在一个查询中将一行插入 MYSQL 表以及其他字段中从 MySQL 函数返回的值?

例如,我有下表:

CREATE TABLE monthly_hours
(
  ProjectID int,
  Year int,
  Month int,
  monthTotalTime int
);
显示给定年份中给定月份的项目工作时间。

我有一个查询,它总结了一个项目花费的总时间:

INSERT INTO time_monthly_hours ( `ProjectID`, `monthTotalTime` ) 
 SELECT jiraissue.PROJECT, SUM(worklog.timeworked) 
 FROM worklog, jiraissue 
 WHERE worklog.issueid = jiraissue.ID 
  AND jiraissue.PROJECT = 13262 
  AND worklog.startdate BETWEEN '2017-01-01 00:00:00' AND '2017-01-18 23:59:59';

我想将 projectID 和 monthTotalTime 插入到monthly_hours 表中的一行中,包括月份和年份。

我试过了:

INSERT INTO time_monthly_hours ( ProjectID, monthTotalTime,  Year, Month ) VALUES
( 
 SELECT jiraissue.PROJECT, SUM(worklog.timeworked) 
 FROM worklog, jiraissue 
 WHERE worklog.issueid = jiraissue.ID 
  AND jiraissue.PROJECT = 13262 
  AND worklog.startdate BETWEEN '2017-01-01 00:00:00' AND '2017-01-18 23:59:59' 
), 
  MONTH(CURRENT_DATE()), YEAR(CURRENT_YEAR() );

但这是一个无效的查询。我已经搜索了很多,但找不到这样的解决方案,可以同时将 SQL 查询结果和 SQL 函数中的值放入一行。

请您给点建议。我需要在 MySQL 级别执行此操作,而不是通过更高级别的工具。谢谢。

演示更新:

(问题内容不变)

根据 BeNice 的要求,我尝试增强格式以使其更具可读性 我稍微更正了标题中的语法(需要对字段使用复数),并且将问题第一行中的“queryto”更正为查询到。谢谢!

【问题讨论】:

能否让您的数据更具可读性(换行符)。 【参考方案1】:

您的查询无效,因为您没有正确使用括号。使用INSERT...VALUES()时,语法必须是:

INSERT INTO <table> (col, col, col, col) VALUES (val, val, val, val);

但你基本上有无效的语法,比如:

INSERT INTO <table> (col, col, col, col) VALUES (val, val), val, val;

使用一个返回两列的子查询还有另一个问题。它不能用于代替 INSERT 语句的标量值。

此外,您将 MONTH() 表达式与 Year 列匹配,将 YEAR() 表达式与 Month 列匹配。

但它比你做的要简单。您可以将常量表达式放入 SELECT 中,因此 SELECT 有四列。

INSERT INTO time_monthly_hours ( ProjectID, monthTotalTime,  Year, Month )     
 SELECT jiraissue.PROJECT, SUM(worklog.timeworked),
  YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE())
 FROM worklog, jiraissue 
 WHERE worklog.issueid = jiraissue.ID 
  AND jiraissue.PROJECT = 13262 
  AND worklog.startdate BETWEEN '2017-01-01 00:00:00' AND '2017-01-18 23:59:59' 

当您使用INSERT...SELECT 时,您不需要VALUES 关键字。

【讨论】:

(1 of 2) +1 upvote 并接受了答案,非常感谢 Bill,回复也很快。我更正了我的原始查询,以便 YEAR(CURRENT_YEAR()) 应该是 YEAR(CURRENT_DATE()) (2 of 2) ...以便整个查询读取(请原谅评论中的有限格式):INSERT INTO time_monthly_hours ( ProjectID, monthTotalTime ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = 13262 AND worklog.startdate BETWEEN '2017-01-01 00:00:00' AND '2017-01-18 23:59:59'; 非常好。我也已按答案编辑以修复 CURRENT_DATE()。以前我什至没有注意到这一点。很高兴能提供帮助。 我已将操作的日期范围增强到 MySQL 函数以确定第一天的开始时间(00:00 时)和当前时间(现在):INSERT INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = 13262 AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW(); - 信用:@ 987654321@ 更新(第 1 次,共 2 次)我已进一步增强它以在触发器中使用:CREATE TRIGGER worklog_update AFTER INSERT ON worklog FOR EACH ROW REPLACE INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = (SELECT PROJECT FROM jiraissue WHERE NEW.issueid = jiraissue.ID ) AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW();

以上是关于sql 查询排除一个字段的其他字段的主要内容,如果未能解决你的问题,请参考以下文章

除了排除的字段外,其余查询所有字段

MySQL查询时,怎么排除某个字段查询

带有子查询排除的 SQL 选择字段

SQL用一个字段排除另一个字段如何做

tp5查询数据库排除某字段

关于sql模糊查询(全字段)