求一个查询语句....弄一早上了..100分

ljsheng 福建泉脉网络科技有限公司 项目总监  2015-12-04 10:32:02
视频表 shipin(gid,qupy,qpyfl,dingdu)
订单表 dingdan(gid,spgid,hygid,payzt)(需要里面的payzt 字段)

要查询视频表所有数据,外加 payzt 的值

就是 SELECT *,payzt FROM shipin 返回这样一个集合/
但是 payzt 要满足查询条件 dingdan 里的 spgid =shipin的gid AND hygid='' 外面传进来的值

shipin.gid payzt(这个字段的值在dingdan表里)
视频A 1
视频A1 1
视频A11 1
视频B2 0
视频B22 0
视频B22 0

需要返回这样的列表/ 就是查询shipin 表所有的数据.
如果 当前shipin表的gid = dingdan 表里的spgid 在等于外面传进来的hygid的值 payzt =dingdan里payzt
不满足等于0
而且要满足shipin表的条件查询 qupy=1 AND qpyfl=3(qupy,qpyfl的查询条件也是外面传进来的 )
...全文
530 点赞 收藏 25
写回复
25 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ljsheng 2015-12-04
嗯.这个也只能做存储过程了.没其他办法 本来有写一个通用的分页方法.现在这个地方没办法用
回复
中国风 2015-12-04
最好是把语句封装在数据库里存储过程去做分页,以后逻辑发生变化不用改程序代码 也可这样用
SELECT 
    a.gid,a.qupy,a.qpyfl,a.dingdu,MAX(CASE WHEN b.spgid IS NOT NULL THEN b.payzt ELSE 0 END) AS payzt
FROM shipin AS a
    LEFT JOIN dingdan AS b ON a.gid=b.spgid AND b.hygid=@hygid    --外面传进来的值
WHERE a.qupy=@qupy AND a.qpyfl=@qpyfl     --外面传进来的值
GROUP BY a.gid,a.qupy,a.qpyfl,a.dingdu
回复
ljsheng 2015-12-04
可以了...这样的查询要做分页看来只能只能用存储过程... 没办法用封装好的 分页查询方法了
回复
ljsheng 2015-12-04

SqlParameter[] parameters = {
                    new SqlParameter("@TableName", SqlDbType.VarChar,20), 
                    new SqlParameter("@Fields", SqlDbType.VarChar,500), 
                    new SqlParameter("@Where", SqlDbType.VarChar,500),
                    new SqlParameter("@OrderBy", SqlDbType.VarChar,200),
                    new SqlParameter("@PageSize", SqlDbType.Int),
                    new SqlParameter("@PageIndex", SqlDbType.Int)};
            parameters[0].Value = TableName;
            parameters[1].Value = Fields;
            parameters[2].Value = LJSheng.Common.LCommon.ClearSql(Where);
            parameters[3].Value = OrderBy;
            parameters[4].Value = PageSize;
            parameters[5].Value = PageIndex;

            //return DbHelperSQL.RunProcedure("Table_List", parameters, "ds");
            //不调用存储过程直接执行查询语句
            string Row = "";
            string TableWhere = parameters[0].SqlValue.ToString();
            int StartNumber;
            int EndNumber;
            if (!String.IsNullOrEmpty(parameters[2].SqlValue.ToString()))
            {
                TableWhere = parameters[0].SqlValue.ToString() + " where " + parameters[2].SqlValue.ToString();
            }

            if (parameters[4].SqlValue.ToString() != "0")
            {
                StartNumber = (Int32.Parse(parameters[5].SqlValue.ToString()) - 1) * Int32.Parse(parameters[4].SqlValue.ToString()) + 1;
                EndNumber = (Int32.Parse(parameters[5].SqlValue.ToString()) - 1) * Int32.Parse(parameters[4].SqlValue.ToString()) + Int32.Parse(parameters[4].SqlValue.ToString());
                Row = " where Row between " + StartNumber.ToString() + " and " + EndNumber.ToString();
            }
            return DbHelperSQL.Query("with temptbl AS (SELECT ROW_NUMBER() OVER (ORDER BY " + parameters[3].SqlValue.ToString() + ")AS Row, " + parameters[1].SqlValue.ToString() + " FROM " + TableWhere + ") SELECT * FROM temptbl" + Row);
回复
中国风 2015-12-04
去掉max
SELECT 
a.*,CASE WHEN b.spgid IS NOT NULL THEN b.payzt ELSE 0 END AS payzt
FROM shipin AS a
    LEFT JOIN (SELECT spgid,MAX(payzt) AS payzt  FROM dingdan WHERE hygid='1052BE4B-174F-44C6-8B83-44AB8352C4FE' GROUP BY spgid) AS b ON a.gid=b.spgid
WHERE a.qupy=1 AND a.qpyfl=3     --外面传进来的值
回复
ljsheng 2015-12-04
引用 19 楼 roy_88 的回复:
MAX(payz) AS payzt --取订单内有多张订单满足时取payzt最大的记录
SELECT 
a.*,max(CASE WHEN b.spgid IS NOT NULL THEN b.payzt ELSE 0 END) AS payzt
FROM shipin AS a
	LEFT JOIN (SELECT spgid,MAX(payz) AS payzt  FROM dingdan WHERE hygid=@hygid GROUP BY spgid) AS b ON a.gid=b.spgid
WHERE a.qupy=@qupy AND a.qpyfl=@qpyfl     --外面传进来的值
--1052BE4B-174F-44C6-8B83-44AB8352C4FE
SELECT 
a.*,max(CASE WHEN b.spgid IS NOT NULL THEN b.payzt ELSE 0 END) AS payzt
FROM shipin AS a
    LEFT JOIN (SELECT spgid,MAX(payzt) AS payzt  FROM dingdan WHERE hygid='1052BE4B-174F-44C6-8B83-44AB8352C4FE' GROUP BY spgid) AS b ON a.gid=b.spgid
WHERE a.qupy=1 AND a.qpyfl=3     --外面传进来的值
消息 8120,级别 16,状态 1,第 2 行 选择列表中的列 'shipin.gid' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。 还是提示这个
回复
中国风 2015-12-04
MAX(payz) AS payzt --取订单内有多张订单满足时取payzt最大的记录
SELECT 
a.*,max(CASE WHEN b.spgid IS NOT NULL THEN b.payzt ELSE 0 END) AS payzt
FROM shipin AS a
	LEFT JOIN (SELECT spgid,MAX(payz) AS payzt  FROM dingdan WHERE hygid=@hygid GROUP BY spgid) AS b ON a.gid=b.spgid
WHERE a.qupy=@qupy AND a.qpyfl=@qpyfl     --外面传进来的值
回复
ljsheng 2015-12-04
偶那个
引用 14 楼 roy_88 的回复:
[quote=引用 11 楼 loveljsheng 的回复:] 就是要按qupy和qpyfl的条件查询shipin表的所有数据.然后又要 判断shipin 的这条记录是否满足用户在dingdan里有购买记录. 有的话就是 shipin 表的家里多一个字段 payzt =dingdan表里的payzt 没有记录就是等于 0
这样效果
SELECT 
a.*,max(CASE WHEN b.spgid IS NOT NULL THEN 1 ELSE 0 END) AS payzt
FROM shipin AS a
	LEFT JOIN (SELECT spgid  FROM dingdan WHERE hygid=@hygid GROUP BY spgid) AS b ON a.gid=b.spgid
WHERE a.qupy=@qupy AND a.qpyfl=@qpyfl     --外面传进来的值
[/quote] 这个不行 还是报错 消息 8120,级别 16,状态 1,第 2 行 选择列表中的列 'shipin.gid' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
回复
ljsheng 2015-12-04
THEN 1 ELSE 0 END 这个是错的...偶的条件是不满足的时候等于0 但是满足的时候不一定是 1 满足的时候是要等于 dingdan里payzt 的值/
回复
ljsheng 2015-12-04
引用 12 楼 roy_88 的回复:
两个表的关系 应该是 1....0~n 这样需要用聚合函数,max取只要有满足条件就成立
如何改成条件成立 payzt 等于 dingdan 表里的payzt? 不满足等于 0
回复
中国风 2015-12-04
显示A表所有列加上payzt时,可用#9 Group by 或用#14
回复
中国风 2015-12-04
引用 11 楼 loveljsheng 的回复:
就是要按qupy和qpyfl的条件查询shipin表的所有数据.然后又要 判断shipin 的这条记录是否满足用户在dingdan里有购买记录. 有的话就是 shipin 表的家里多一个字段 payzt =dingdan表里的payzt 没有记录就是等于 0
这样效果
SELECT 
a.*,max(CASE WHEN b.spgid IS NOT NULL THEN 1 ELSE 0 END) AS payzt
FROM shipin AS a
	LEFT JOIN (SELECT spgid  FROM dingdan WHERE hygid=@hygid GROUP BY spgid) AS b ON a.gid=b.spgid
WHERE a.qupy=@qupy AND a.qpyfl=@qpyfl     --外面传进来的值
回复
ljsheng 2015-12-04
就是要按qupy和qpyfl的条件查询shipin表的所有数据.然后又要 判断shipin 的这条记录是否满足用户在dingdan里有购买记录. 有的话就是 shipin 表的家里多一个字段 payzt =dingdan表里的payzt 没有记录就是等于 0
回复
ljsheng 2015-12-04
引用 10 楼 roy_88 的回复:
漏敲了GROUP BY ,按以上方法看看结果对不对
可以了.还是版主厉害.. 现在偶相信怎么弄成分页查询..偶这个是放在 分页查询 SqlParameter[] parameters = { new SqlParameter("@TableName", SqlDbType.VarChar,20), new SqlParameter("@Fields", SqlDbType.VarChar,500), new SqlParameter("@Where", SqlDbType.VarChar,500), new SqlParameter("@OrderBy", SqlDbType.VarChar,200), new SqlParameter("@PageSize", SqlDbType.Int), new SqlParameter("@PageIndex", SqlDbType.Int)}; parameters[0].Value = TableName; parameters[1].Value = Fields; parameters[2].Value = LJSheng.Common.LCommon.ClearSql(Where); parameters[3].Value = OrderBy; parameters[4].Value = PageSize; parameters[5].Value = PageIndex; //return DbHelperSQL.RunProcedure("Table_List", parameters, "ds"); //不调用存储过程直接执行查询语句 string Row = ""; string TableWhere = parameters[0].SqlValue.ToString(); int StartNumber; int EndNumber; if (!String.IsNullOrEmpty(parameters[2].SqlValue.ToString())) { TableWhere = parameters[0].SqlValue.ToString() + " where " + parameters[2].SqlValue.ToString(); } if (parameters[4].SqlValue.ToString() != "0") { StartNumber = (Int32.Parse(parameters[5].SqlValue.ToString()) - 1) * Int32.Parse(parameters[4].SqlValue.ToString()) + 1; EndNumber = (Int32.Parse(parameters[5].SqlValue.ToString()) - 1) * Int32.Parse(parameters[4].SqlValue.ToString()) + Int32.Parse(parameters[4].SqlValue.ToString()); Row = " where Row between " + StartNumber.ToString() + " and " + EndNumber.ToString(); } return DbHelperSQL.Query("with temptbl AS (SELECT ROW_NUMBER() OVER (ORDER BY " + parameters[3].SqlValue.ToString() + ")AS Row, " + parameters[1].SqlValue.ToString() + " FROM " + TableWhere + ") SELECT * FROM temptbl" + Row);
回复
中国风 2015-12-04
漏敲了GROUP BY ,按以上方法看看结果对不对
回复
中国风 2015-12-04
两个表的关系 应该是 1....0~n 这样需要用聚合函数,max取只要有满足条件就成立
回复
中国风 2015-12-04
引用 7 楼 loveljsheng 的回复:
[quote=引用 5 楼 roy_88 的回复:] [quote=引用 3 楼 loveljsheng 的回复:] [quote=引用 1 楼 roy_88 的回复:]
SELECT 
	a.gid,max(CASE WHEN b.spgid IS NOT NULL THEN 1 ELSE 0 END) AS payzt
FROM shipin AS a
	LEFT JOIN dingdan AS b ON a.gid=b.spgid AND b.hygid=''	--外面传进来的值
WHERE a.qupy=1 AND a.qpyfl=3
(qupy,qpyfl的查询条件也是外面传进来的 )[/quote] 在where条件时把值替换成参数,看结果是否正确
SELECT 
	a.gid,max(CASE WHEN b.spgid IS NOT NULL THEN 1 ELSE 0 END) AS payzt
FROM shipin AS a
	LEFT JOIN dingdan AS b ON a.gid=b.spgid AND b.hygid=@hygid	--外面传进来的值
WHERE a.qupy=@qupy AND a.qpyfl=@qpyfl	 --外面传进来的值
[/quote] 消息 8120,级别 16,状态 1,第 2 行 选择列表中的列 'shipin.gid' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。 替换参数还是这个错误///[/quote]
SELECT 
    a.gid,max(CASE WHEN b.spgid IS NOT NULL THEN 1 ELSE 0 END) AS payzt
FROM shipin AS a
    LEFT JOIN dingdan AS b ON a.gid=b.spgid AND b.hygid=@hygid    --外面传进来的值
WHERE a.qupy=@qupy AND a.qpyfl=@qpyfl     --外面传进来的值
GROUP BY a.gid
回复
Tiger_Zhao 2015-12-04
看起来 dingdan 的(gid,spgid,hygid) 是主键,所以不需要分组统计。
这是最简单的左联啊。
因为要查询shipin 表所有的数据,所以过滤条件要加在 ON 而不是 WHERE 下。
回复
Tiger_Zhao 2015-12-04
    SELECT s.gid,
ISNULL(d.payzt,0) payzt
FROM shipin s
LEFT JOIN dingdan d
ON s.gid = d.gid
AND d.spgid = @spgid
AND d.hygid = @hygid
回复
ljsheng 2015-12-04
引用 5 楼 roy_88 的回复:
[quote=引用 3 楼 loveljsheng 的回复:] [quote=引用 1 楼 roy_88 的回复:]
SELECT 
	a.gid,max(CASE WHEN b.spgid IS NOT NULL THEN 1 ELSE 0 END) AS payzt
FROM shipin AS a
	LEFT JOIN dingdan AS b ON a.gid=b.spgid AND b.hygid=''	--外面传进来的值
WHERE a.qupy=1 AND a.qpyfl=3
(qupy,qpyfl的查询条件也是外面传进来的 )[/quote] 在where条件时把值替换成参数,看结果是否正确
SELECT 
	a.gid,max(CASE WHEN b.spgid IS NOT NULL THEN 1 ELSE 0 END) AS payzt
FROM shipin AS a
	LEFT JOIN dingdan AS b ON a.gid=b.spgid AND b.hygid=@hygid	--外面传进来的值
WHERE a.qupy=@qupy AND a.qpyfl=@qpyfl	 --外面传进来的值
[/quote] 消息 8120,级别 16,状态 1,第 2 行 选择列表中的列 'shipin.gid' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。 替换参数还是这个错误///
回复
加载更多回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-12-04 10:32
社区公告
暂无公告