免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4922 | 回复: 7
打印 上一主题 下一主题

如何通过sql查询出如下结果(不要用存储过程) [复制链接]

求职 : Linux运维
论坛徽章:
10
丑牛
日期:2013-11-22 14:59:41数据库技术版块每日发帖之星
日期:2016-08-13 06:20:0015-16赛季CBA联赛之山西
日期:2016-08-03 10:35:38数据库技术版块每日发帖之星
日期:2016-07-31 06:20:002016科比退役纪念章
日期:2016-06-27 14:08:14数据库技术版块每日发帖之星
日期:2016-06-02 06:20:0015-16赛季CBA联赛之广东
日期:2016-05-20 15:06:2215-16赛季CBA联赛之深圳
日期:2016-01-29 16:27:402015亚冠之阿尔艾因
日期:2015-09-08 16:35:3615-16赛季CBA联赛之北京
日期:2017-03-28 18:45:36
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-27 17:38 |只看该作者 |倒序浏览
目前有2张表A表和B表;B表中的数据是固定不变的;但A表中的数据是可变的,但只可能出现2种情况;

1.A表中数据可能有如下两种情况,为方便描述,记为A1表和A2表;

A1表中数据内容:
a   1   1
b   1   2


A2表中数据内容:
b   1   2

B表中数据内容:
a   0   0

2. 现通过A和B表进行联表查询,

  (1)如果查询时,发现A表中的内容是A1时,那么希望查询结果为:
  a  1  1
  b  1  2


  (2)如果查询时,发现A表中的内容是A2时,那么希望查询结果为:
  a   0  0
  b   1  2


如果用sql查询(不要存储过程)实现2的结果,该怎么写呢?谢谢!

求职 : Linux运维
论坛徽章:
10
丑牛
日期:2013-11-22 14:59:41数据库技术版块每日发帖之星
日期:2016-08-13 06:20:0015-16赛季CBA联赛之山西
日期:2016-08-03 10:35:38数据库技术版块每日发帖之星
日期:2016-07-31 06:20:002016科比退役纪念章
日期:2016-06-27 14:08:14数据库技术版块每日发帖之星
日期:2016-06-02 06:20:0015-16赛季CBA联赛之广东
日期:2016-05-20 15:06:2215-16赛季CBA联赛之深圳
日期:2016-01-29 16:27:402015亚冠之阿尔艾因
日期:2015-09-08 16:35:3615-16赛季CBA联赛之北京
日期:2017-03-28 18:45:36
2 [报告]
发表于 2016-05-27 17:39 |只看该作者
目前有2张表A表和B表;B表中的数据是固定不变的;但A表中的数据是可变的,但只可能出现2种情况;

1.A表中数据可能有如下两种情况,为方便描述,记为A1表和A2表;

A1表中数据内容:
a   1   1
b   1   2

A2表中数据内容:
b   1   2

B表中数据内容:
a   0   0

2. 现通过A和B表进行联表查询,

  (1)如果查询时,发现A表中的内容是A1时,那么希望查询结果为:
  a  1  1
  b  1  2

  (2)如果查询时,发现A表中的内容是A2时,那么希望查询结果为:
  a   0  0
  b   1  2


如果用sql查询(不要存储过程)实现2的结果,该怎么写呢?谢谢!

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
3 [报告]
发表于 2016-05-30 10:49 |只看该作者
夏寥寥 发表于 2016-05-27 17:39
目前有2张表A表和B表;B表中的数据是固定不变的;但A表中的数据是可变的,但只可能出现2种情况;

1.A表中 ...


如果可以用动态语句可以试试这个:
  1. mysql> select * from a;
  2. +----+----+----+
  3. | c1 | c2 | c3 |
  4. +----+----+----+
  5. | a  | 1  | 1  |
  6. | b  | 1  | 2  |
  7. +----+----+----+
  8. 2 rows in set

  9. mysql> select * from b;
  10. +----+----+----+
  11. | c1 | c2 | c3 |
  12. +----+----+----+
  13. | a  | 0  | 0  |
  14. +----+----+----+
  15. 1 row in set

  16. mysql> select @count_a := count(*) from a;
  17. select @str := if (@count_a = 2, 'select * from a', 'select * from b union all select * from a');
  18. prepare st from @str;
  19. execute st;
  20. deallocate prepare st;
  21. +----------------------+
  22. | @count_a := count(*) |
  23. +----------------------+
  24. |                    2 |
  25. +----------------------+
  26. 1 row in set

  27. +-------------------------------------------------------------------------------------------+
  28. | @str := if (@count_a = 2, 'select * from a', 'select * from b union all select * from a') |
  29. +-------------------------------------------------------------------------------------------+
  30. | select * from a                                                                           |
  31. +-------------------------------------------------------------------------------------------+
  32. 1 row in set

  33. Query OK, 0 rows affected
  34. Statement prepared

  35. +----+----+----+
  36. | c1 | c2 | c3 |
  37. +----+----+----+
  38. | a  | 1  | 1  |
  39. | b  | 1  | 2  |
  40. +----+----+----+
  41. 2 rows in set

  42. Query OK, 0 rows affected

  43. mysql>

复制代码


  1. mysql> select * from a;
  2. +----+----+----+
  3. | c1 | c2 | c3 |
  4. +----+----+----+
  5. | b  | 1  | 2  |
  6. +----+----+----+
  7. 1 row in set

  8. mysql> select * from b;
  9. +----+----+----+
  10. | c1 | c2 | c3 |
  11. +----+----+----+
  12. | a  | 0  | 0  |
  13. +----+----+----+
  14. 1 row in set

  15. mysql> select @count_a := count(*) from a;
  16. select @str := if (@count_a = 2, 'select * from a', 'select * from b union all select * from a');
  17. prepare st from @str;
  18. execute st;
  19. deallocate prepare st;
  20. +----------------------+
  21. | @count_a := count(*) |
  22. +----------------------+
  23. |                    1 |
  24. +----------------------+
  25. 1 row in set

  26. +-------------------------------------------------------------------------------------------+
  27. | @str := if (@count_a = 2, 'select * from a', 'select * from b union all select * from a') |
  28. +-------------------------------------------------------------------------------------------+
  29. | select * from b union all select * from a                                                 |
  30. +-------------------------------------------------------------------------------------------+
  31. 1 row in set

  32. Query OK, 0 rows affected
  33. Statement prepared

  34. +----+----+----+
  35. | c1 | c2 | c3 |
  36. +----+----+----+
  37. | a  | 0  | 0  |
  38. | b  | 1  | 2  |
  39. +----+----+----+
  40. 2 rows in set

  41. Query OK, 0 rows affected

  42. mysql>
复制代码
不然,可以用这个试试:

  1. mysql> select * from a;
  2. +----+----+----+
  3. | c1 | c2 | c3 |
  4. +----+----+----+
  5. | b  | 1  | 2  |
  6. +----+----+----+
  7. 1 row in set

  8. mysql> select * from b;
  9. +----+----+----+
  10. | c1 | c2 | c3 |
  11. +----+----+----+
  12. | a  | 0  | 0  |
  13. +----+----+----+
  14. 1 row in set

  15. mysql> select c1, c2, c3
  16. from
  17. (
  18.         select *, 'b' as tb, (select count(*) from a) as cnt from b
  19.         union all
  20.         select *, 'a', (select count(*) from a) from a
  21. ) as tmp
  22. where (tb, cnt) in (('b', 1), ('a', 1), ('a', 2));
  23. +----+----+----+
  24. | c1 | c2 | c3 |
  25. +----+----+----+
  26. | a  | 0  | 0  |
  27. | b  | 1  | 2  |
  28. +----+----+----+
  29. 2 rows in set

  30. mysql>

复制代码

  1. mysql> select * from a;
  2. +----+----+----+
  3. | c1 | c2 | c3 |
  4. +----+----+----+
  5. | a  | 1  | 1  |
  6. | b  | 1  | 2  |
  7. +----+----+----+
  8. 2 rows in set

  9. mysql> select * from b;
  10. +----+----+----+
  11. | c1 | c2 | c3 |
  12. +----+----+----+
  13. | a  | 0  | 0  |
  14. +----+----+----+
  15. 1 row in set

  16. mysql> select c1, c2, c3
  17. from
  18. (
  19.         select *, 'b' as tb, (select count(*) from a) as cnt from b
  20.         union all
  21.         select *, 'a', (select count(*) from a) from a
  22. ) as tmp
  23. where (tb, cnt) in (('b', 1), ('a', 1), ('a', 2));
  24. +----+----+----+
  25. | c1 | c2 | c3 |
  26. +----+----+----+
  27. | a  | 1  | 1  |
  28. | b  | 1  | 2  |
  29. +----+----+----+
  30. 2 rows in set

  31. mysql>
复制代码

求职 : Linux运维
论坛徽章:
10
丑牛
日期:2013-11-22 14:59:41数据库技术版块每日发帖之星
日期:2016-08-13 06:20:0015-16赛季CBA联赛之山西
日期:2016-08-03 10:35:38数据库技术版块每日发帖之星
日期:2016-07-31 06:20:002016科比退役纪念章
日期:2016-06-27 14:08:14数据库技术版块每日发帖之星
日期:2016-06-02 06:20:0015-16赛季CBA联赛之广东
日期:2016-05-20 15:06:2215-16赛季CBA联赛之深圳
日期:2016-01-29 16:27:402015亚冠之阿尔艾因
日期:2015-09-08 16:35:3615-16赛季CBA联赛之北京
日期:2017-03-28 18:45:36
4 [报告]
发表于 2016-05-30 14:01 |只看该作者
select B.column1,B.column2,B.column3  from B
join A on B.colum1 = A.column1
union
select A.column1, nvl(B.column2,A.column2),nvl(B.column3,A.column3)  from A
left join B on B.colum1 = A.column1

求职 : Linux运维
论坛徽章:
10
丑牛
日期:2013-11-22 14:59:41数据库技术版块每日发帖之星
日期:2016-08-13 06:20:0015-16赛季CBA联赛之山西
日期:2016-08-03 10:35:38数据库技术版块每日发帖之星
日期:2016-07-31 06:20:002016科比退役纪念章
日期:2016-06-27 14:08:14数据库技术版块每日发帖之星
日期:2016-06-02 06:20:0015-16赛季CBA联赛之广东
日期:2016-05-20 15:06:2215-16赛季CBA联赛之深圳
日期:2016-01-29 16:27:402015亚冠之阿尔艾因
日期:2015-09-08 16:35:3615-16赛季CBA联赛之北京
日期:2017-03-28 18:45:36
5 [报告]
发表于 2016-05-30 14:06 |只看该作者
select B.column1,B.column2,B.column3  from B
join A on B.colum1 = A.column1
union all
select A.column1, nvl(B.column2,A.column2),nvl(B.column3,A.column3)  from A
left join B on B.colum1 = A.column1

求职 : Linux运维
论坛徽章:
10
丑牛
日期:2013-11-22 14:59:41数据库技术版块每日发帖之星
日期:2016-08-13 06:20:0015-16赛季CBA联赛之山西
日期:2016-08-03 10:35:38数据库技术版块每日发帖之星
日期:2016-07-31 06:20:002016科比退役纪念章
日期:2016-06-27 14:08:14数据库技术版块每日发帖之星
日期:2016-06-02 06:20:0015-16赛季CBA联赛之广东
日期:2016-05-20 15:06:2215-16赛季CBA联赛之深圳
日期:2016-01-29 16:27:402015亚冠之阿尔艾因
日期:2015-09-08 16:35:3615-16赛季CBA联赛之北京
日期:2017-03-28 18:45:36
6 [报告]
发表于 2016-05-30 20:34 |只看该作者
回复 3# seesea2517

谢谢大神!两种方法都能查到相应的结果!


   

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
7 [报告]
发表于 2016-05-31 10:36 |只看该作者
回复 6# 夏寥寥


    客气,不是什么大神,谬赞。你的方法也不错啊,nvl 在 mysql 里我改成 ifnull 来测试效果不错。我不知道你这两个表还有数据相关的,想不到用连接的这个方法了。

求职 : Linux运维
论坛徽章:
10
丑牛
日期:2013-11-22 14:59:41数据库技术版块每日发帖之星
日期:2016-08-13 06:20:0015-16赛季CBA联赛之山西
日期:2016-08-03 10:35:38数据库技术版块每日发帖之星
日期:2016-07-31 06:20:002016科比退役纪念章
日期:2016-06-27 14:08:14数据库技术版块每日发帖之星
日期:2016-06-02 06:20:0015-16赛季CBA联赛之广东
日期:2016-05-20 15:06:2215-16赛季CBA联赛之深圳
日期:2016-01-29 16:27:402015亚冠之阿尔艾因
日期:2015-09-08 16:35:3615-16赛季CBA联赛之北京
日期:2017-03-28 18:45:36
8 [报告]
发表于 2016-05-31 17:00 |只看该作者
回复 7# seesea2517

我写错了!nvl是oracle里的,ifnull才是mysql中的! 谢谢!

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP