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 查询排除一个字段的其他字段的主要内容,如果未能解决你的问题,请参考以下文章