sql多表查询语句解释一下啥意思,还有怎么样插入一行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql多表查询语句解释一下啥意思,还有怎么样插入一行相关的知识,希望对你有一定的参考价值。

public static DataTable GetAllFBLandByuserId(int userId)

string sql = "select * from "
+ " (select fbout.fb_id as [id],fbout.fb_outId as outId,fbout.fb_userId as userId,fbout.fb_title as title,fbout.fb_type as type,fbout.fb_addtime as addtime,fbout.fb_delete as fbdelete,area.area_name as qy ,1 as Btype from tb_factoryBuilding_out fbout"
+ " left join tb_Area area on fbout.fb_areaId=area.area_id"
+ " union all "
+ " select fbIn.fb_id,fbIn.fb_InId,fbIn.fb_userId ,fbIn.fb_title,fbIn.fb_type ,fbIn.fb_addtime,fbIn.fb_delete,area.area_name ,2 as Btype from tb_factoryBuilding_in fbIn"
+ " left join tb_Area area on fbIn.fb_areaId=area.area_id"
+ " union all "
+ " select landout.land_id,landout.land_outId,landout.land_userId ,landout.land_title,landout.land_type ,landout.land_addtime,landout.land_delete,area.area_name,3 as Btype from tb_land_out landout"
+ " left join tb_Area area on landout.land_areaId=area.area_id"
+ " union all "
+ " select landIn.land_id,landIn.land_inId,landIn.land_userId ,landIn.land_title,landIn.land_type ,landIn.land_addtime,landIn.land_delete,area.area_name ,4 as Btype from tb_land_in landIn"
+ " left join tb_Area area on landIn.land_areaId=area.area_id)"
+ " as a where userid=@userId and fbdelete=0 order by addtime desc ";

try

return DBHelper.ExecuteDataTable(sql, new SqlParameter("@userId", userId));

catch (Exception e)


throw e;



插入 string sql = "select * from tb_FactoryBuilding_out where fb_Audit=0 ";

参考技术A 晕,好乱哦。
简单说,就是先查询几张有关系的表,然后把结果全部union起来(查询的结果里的字段必须数目一样,类型一样),就是A结果+B结果然后再作为一个结果集当做一个表F,再对表F进行输入参数的条件查询。
至于插入一条数据,语句是:Insert into 表名 values (列值1,列值2,....)追问

是在上面的语句里插入这一行查询,不是插入数据

追答

那要看你插入的这个Select语句查询的结果是否和其他的Select子查询结果的列数和类型都一致了,如果一致,就用union连上你要插入的语句,要在括号里哦,否则不行。

参考技术B 建议使用StringBuffer来连接,效率更高!
java的
StringBuffer sqlStr = new StringBuffer();
sqlStr.append(" SELECT ");
sqlStr.append(" * ");
sqlStr.append(" FROM ");
sqlStr.append(" ( ");
sqlStr.append(" SELECT");
sqlStr.append(" fbout.fb_id as [id],");
sqlStr.append(" fbout.fb_outId as outId,");
sqlStr.append(" fbout.fb_userId as userId, ");
sqlStr.append(" fbout.fb_title as title, ");
sqlStr.append(" fbout.fb_type as type, ");
sqlStr.append(" fbout.fb_addtime as addtime, ");
sqlStr.append(" fbout.fb_delete as fbdelete, ");
sqlStr.append(" area.area_name as qy , ");
sqlStr.append(" 1 as Btype ");
sqlStr.append(" FROM ");
sqlStr.append(" tb_factoryBuilding_out fbout");
sqlStr.append(" LEFT JOIN ");
sqlStr.append(" tb_Area area");
sqlStr.append(" ON ");
sqlStr.append(" fbout.fb_areaId= area.area_id");
sqlStr.append(" UNION ALL ");
sqlStr.append(" SELECT ");
sqlStr.append(" fbIn.fb_id,");
sqlStr.append(" fbIn.fb_InId, ");
sqlStr.append(" fbIn.fb_userId , ");
sqlStr.append(" fbIn.fb_title, ");
sqlStr.append(" fbIn.fb_type , ");
sqlStr.append(" fbIn.fb_addtime, ");
sqlStr.append(" fbIn.fb_delete, ");
sqlStr.append(" area.area_name , ");
sqlStr.append(" 2 as Btype ");
sqlStr.append(" FROM ");
sqlStr.append(" tb_factoryBuilding_in fbIn");
sqlStr.append(" LEFT JOIN ");
sqlStr.append(" tb_Area area");
sqlStr.append(" ON ");
sqlStr.append(" fbIn.fb_areaId= area.area_id");
sqlStr.append(" UNION ALL ");
sqlStr.append(" SELECT ");
sqlStr.append(" landout.land_id,");
sqlStr.append(" landout.land_outId,");
sqlStr.append(" landout.land_userId , ");
sqlStr.append(" landout.land_title, ");
sqlStr.append(" landout.land_type , ");
sqlStr.append(" landout.land_addtime, ");
sqlStr.append(" landout.land_delete, ");
sqlStr.append(" area.area_name, ");
sqlStr.append(" 3 as Btype ");
sqlStr.append(" FROM ");
sqlStr.append(" tb_land_out landout");
sqlStr.append(" LEFT JOIN ");
sqlStr.append(" tb_Area area");
sqlStr.append(" ON ");
sqlStr.append(" landout.land_areaId= area.area_id");
sqlStr.append(" UNION ALL ");
sqlStr.append(" SELECT ");
sqlStr.append(" landIn.land_id,");
sqlStr.append(" landIn.land_inId, ");
sqlStr.append(" landIn.land_userId , ");
sqlStr.append(" landIn.land_title, ");
sqlStr.append(" landIn.land_type , ");
sqlStr.append(" landIn.land_addtime, ");
sqlStr.append(" landIn.land_delete, ");
sqlStr.append(" area.area_name , ");
sqlStr.append(" 4 as Btype ");
sqlStr.append(" FROM ");
sqlStr.append(" tb_land_in landIn");
sqlStr.append(" LEFT JOIN ");
sqlStr.append(" tb_Area area");
sqlStr.append(" ON ");
sqlStr.append(" landIn.land_areaId= area.area_id");
sqlStr.append(" UNION ALL ");
sqlStr.append(" SELECT "); //新增加的
sqlStr.append(" fbout.fb_id as [id],");
sqlStr.append(" fbout.fb_outId as outId, ");
sqlStr.append(" fbout.fb_userId as userId, ");
sqlStr.append(" fbout.fb_title as title, ");
sqlStr.append(" fbout.fb_type as type, ");
sqlStr.append(" fbout.fb_addtime as addtime, ");
sqlStr.append(" fbout.fb_delete as fbdelete, ");
sqlStr.append(" '' as qy , "); //和上面的匹配
sqlStr.append(" 1 as Btype ");
sqlStr.append(" FROM ");
sqlStr.append(" tb_factoryBuilding_out fbout");
sqlStr.append(" WHERE ");
sqlStr.append(" fbout.fb_Audit= 0");
sqlStr.append(" ) as a ");
sqlStr.append(" WHERE ");
sqlStr.append(" userid = @userId");
sqlStr.append(" and fbdelete= 0 ");
sqlStr.append(" ORDER BY ");
sqlStr.append(" addtime desc");追问

错误 未能找到类型或命名空间名称“StringBuffer”(是否缺少 using 指令或程序集引用?)F:\Web05\DAL\FB-landService.cs 254 39 DAL

追答

你的不是java语法吗?
如果不是的话还是用你的+来连接,上面的sql是好使的

追问

C# sqlStr.append替换成+是吗

追答

恩,还要把后面的 ) 去掉
C# 里也有类似的连接字符串的类 stringbuilder !

参考技术C 你所说的插入 sql = "select * from tb_FactoryBuilding_out where fb_Audit=0 ";
数据必须与上面的union的每个查询的字段(随便看一个都可以)有对应关系
查出来的如果没有对应关系 需要将你显示的顺序调整下 起别名和union中查询的每个字段一样 列名一致 注意如果字段类型不同需要转一下类型 这样就可以了
就是再union 一个 select XXX1 fb_id,XXX2 fb_userId...from FactoryBuilding where fb_Audit=0追问

+ " select fbout.fb_Audit,area.area_name from tb_factoryBuilding_out fbout"
+ " left join tb_Area area on fbout.fb_areaId=area.area_id"
+ " union all "

报错
使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式。

麻烦帮我解决一下

追答

我所描述的点点点。。。意思就是你的union查询是
fbout.fb_id as id,
fbout.fb_outId as outId,
fbout.fb_userId as userId,
fbout.fb_title as title,
fbout.fb_type as type,
fbout.fb_addtime as addtime,
fbout.fb_delete as fbdelete,
area.area_name as qy,
1 as Btype
9个字段 所以你这只查fbout.fb_Audit,area.area_name两个字段肯定报错啊 如果也叫这些字段名最好 如果不叫 需要对应好位置然后取别名

追问

报错 在将 varchar 值 'CS39' 转换成数据类型 int 时失败。
这个哪来的

追答

我开始说了 注意如果字段类型不同需要转一下类型 你查询的cs39这个列在这个表中是varchar类型的 上边union中对应的列是int类型的 所以要么你的是数字 可以用个转换函数(不同数据库类型转换函数不一样 mysql,sqlserver是cast oracle是to_number) 要么这个不是数字 那没有办法 只能换一列是varchar类型的显示

追问

还有感觉不对头,我是每行都插入fb_Audit属性,不是单行,

追答

如果你编号是'CS39'这个内容 因为有字母 那没有办法 不能显示在这一列 必须是纯数字 至于转换
参考
1. convert(int,字段名) 例如:select convert(int,'3')
2. cast(字段名 as int) 例如:select cast('3' as int)

追问

但fb_Audit只有在tb_factoryBuilding_out 表中才有

追答

用hi吧 你这追问的也是

本回答被提问者采纳
参考技术D select top 1 * from table where 许用合力 > 75 and 许用扭矩 > 10 and 传动滚筒直径 = 1000 order by 许用扭矩, 许用合力

--输出结果就是先符合条件数据,再按许用扭矩和许用合力的升序排列,然后选取第一条,即最近的一条数据。
第5个回答  2012-01-05 其实很好理解。
首先你确定你是否知道union all 的含义,如果知道,那么试问,你是否知道left join的含义。
知道两者以后,这个SQL你就能看懂了。追问

但是我怎样插入语句才对呢,总是报错

追答

你要的插入,请问是怎么个理解,是你的这些JOIN表每个表都要进行插入还是只对某一个表执行插入。

同时建议你把你的插入语句写出来,这样更有针对性一些。

sql里面 with...as 是啥意思啊?如何使用

求别复制,那些咱全看过了,看不懂...
~用简单的方法来解释
谢谢~

with...as是用来定义sql代码片段的语句,一般是在sql嵌套查询比较多的时候应用,可以增加sql语句的可读性。下面我以sql server来具体演示一下with...as怎么用:

1、准备要操作的数据,假设要查询下面年龄大于40岁的数据,如下图所示

2、用with...as将查询结果定义成一个表cr,cr不是硬性要求,你可以自己定义成喜欢的名字,如下图所示

3、然后就可以直接从cr表中查询数据,如下图所示

4,最后我们可以看到需要的数据从cr中被查询出来了,如下图所示

参考技术A 是公用表表达式,可以理解为创建临时表。比如
WITH A AS(SELECT * FROM TABLE1)
SELECT * FROM A追问

和view 的性质是一样的吗?

追答

类似,VIEW语句是真正的创建了一个对象,WITH AS 公用表表达式不创建对象,只能被后随的SELECT语句使用

追问

用with as 时, 后面必须加上select来立刻查询吗?

追答

对,但是可以像一个表一样在后续的SELECT语句中设定WHERE条件或连接其他表等。

本回答被提问者采纳
参考技术B 你把with .. as

当成一个临时的视图,就可以了

以上是关于sql多表查询语句解释一下啥意思,还有怎么样插入一行的主要内容,如果未能解决你的问题,请参考以下文章

sqlite数据库怎么进行多表连接查询,表之间有相同的字段,除了改字段名称,还有啥办法吗

C语言中的default是啥意思,怎么用?

sql里面 with...as 是啥意思啊?如何使用

SQL语句中两个表的连接

sql多表查询出来的数据在C#中用啥装载比较好,是泛型集合还是集合??还有其他的可以装吗??

SQL 基础之子查询多表插入merge 语句跟踪一段时间数据变化(二十)