求一个查询语句....弄一早上了..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的查询条件也是外面传进来的 )
...全文
567 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
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 子句中。 替换参数还是这个错误///
加载更多回复(5)
访问真八字排盘系统介绍: 1、八字排盘 八字排盘是将年月日时按照天干地支的形式进行排列,一个时间单位代表了一个柱。八字由年柱、月柱、日柱和时柱共四个柱组成,也被称为四柱八字。八字学中基于中国阴阳五行、天干地支与刑冲克害、以及民间盲派的神煞论等方式,进一步预测爱情顺遂、工作高低、姻缘好坏、财富高低、学业成就、身体健康等事的学问。 八字排盘由以下元素组合:年月日时四柱、大运干支、胎元 、流年干支、十神、地势、神煞等。生辰八字不只是把干支历计算出来,而还要遵守月令、节令的强弱,时辰的阴阳变化进行校正。排盘析,就是根据出生者的性别、天干地支的阴阳五行关系、进一步推算出来的一套方法论,给预测者做人生吉凶的参考数据,在未来事业、财运、婚姻、家庭等问题时,能做出风险较低的决策。 八字排盘怎么看 八字排盘由年、月、日、时四柱组成,每柱包含一个天干和一个地支,共八个字。年柱代表出生的年份,月柱代表出生的月份,日柱代表出生的日期,时柱则代表出生的时辰。每个柱的干支组合都会对个人的命运产生影响。天干地支旁边标注的正财、偏财、偏印、正印、比肩、劫财、食神、伤官、正官、七杀等,称为十神。 2、八字排盘软件介绍 我们是腾讯云市场金牌合作伙伴,广州正规软件开发公司,开发的八字排盘系统数据最全面精准,我们八字排盘采用最精确的排盘程序,而且运用“真太阳时”,进行更精确的时间划。大家都知道我们使用的北京时间,是统一规定的标准时间。而八字排盘需要相对于太阳方位的天文时间,即平太阳时。我们国家地大物博,北京时间19时,哈尔滨已经夜幕降临,而新疆却还是太阳高挂,这时哈尔滨的天文时间可能在20:00以后,而新疆的天文时间可能在16时以前。北京时间是东经120度经线的平太阳时,如果您出生地的经度与北京时间所处的经度差异较大,或者处于单数时间点的前后,比如6点差一刻,8点,10点15

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧