求一个两表联合查询的SQL语句

xiaozhou1121 2011-01-08 02:55:04
A表
ID NAME
1 A1
2 A2
3 A3

B表
ID DATE DATA
1 20100101 1.1
2 20100102 1.2

A表的ID=B表的ID,B表比A表少一条记录,想得到如下结果

1 A1 20100101 1.1
2 A2 20100101 1.2
3 A3 20100101 NULL (或0)
...全文
132 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaozhou1121 2011-01-21
  • 打赏
  • 举报
回复
接受意见,下次提问,一定改正。但这个问题,#13(mr_mablevi)是正解,在此表示感谢。也感谢#12(ACMAIN_CHM)提出的意见。
gw6328 2011-01-14
  • 打赏
  • 举报
回复
SELECT A.id,B.date,B.date FROM A LEFT JOIN B ON A.ID=B.ID
是行的。刚试了
czy415999744 2011-01-14
  • 打赏
  • 举报
回复
两张表的数据不一样怎么找啊,
ACMAIN_CHM 2011-01-14
  • 打赏
  • 举报
回复
[Quote]A表的ID=B表的ID,想得到如下结果

1 A1 20100101 1.1
2 A2 20100101 2.1
3 A3 NULL NULL[/Quote]

[Quote]+------+------+----------+------+
| id | name | date | data |
+------+------+----------+------+
| 1 | A1 | 20100102 | 1.2 |
| 2 | A2 | 20100102 | 2.2 |
| 3 | A3 | NULL | NULL |
+------+------+----------+------+
3 rows in set (0.00 sec)[/Quote]
结果显然不一致。
小小小小周 2011-01-14
  • 打赏
  • 举报
回复
估计楼主他急的打错了想要的结果
小小小小周 2011-01-14
  • 打赏
  • 举报
回复
mysql> select * from aaaa;
+------+------+------+
| id | name | type |
+------+------+------+
| 1 | A1 | 1 |
| 2 | A2 | 1 |
| 3 | A3 | 1 |
| 4 | A4 | 2 |
+------+------+------+
4 rows in set (0.00 sec)

mysql> select * from bbbb;
+------+----------+------+
| id | date | data |
+------+----------+------+
| 1 | 20100101 | 1.1 |
| 1 | 20100102 | 1.2 |
| 2 | 20100101 | 2.1 |
| 2 | 20100102 | 2.2 |
| 3 | 20100101 | 3.1 |
| 4 | 20100101 | 4.1 |
+------+----------+------+
6 rows in set (0.00 sec)

mysql> SELECT aaaa.id, aaaa.name,bbbb.date, bbbb.data
-> FROM (select * from aaaa where aaaa.type=1) aaaa LEFT JOIN (select * fr
om bbbb where bbbb.date = 20100102) as bbbb ON aaaa.id = bbbb.id
-> ;
+------+------+----------+------+
| id | name | date | data |
+------+------+----------+------+
| 1 | A1 | 20100102 | 1.2 |
| 2 | A2 | 20100102 | 2.2 |
| 3 | A3 | NULL | NULL |
+------+------+----------+------+
3 rows in set (0.00 sec)

mysql>


先在各自的表先把条件过滤了,再join.不要join之后再过滤
ACMAIN_CHM 2011-01-14
  • 打赏
  • 举报
回复
建议提问前,自己先仔细看一遍自己的描述。要知道很多中国人并不一定能看得懂你的中文。

(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

ACMAIN_CHM 2011-01-14
  • 打赏
  • 举报
回复
B表
ID DATE DATA
1 20100101 1.1
1 20100102 1.2
2 20100101 2.1
2 20100102 2.2
3 20100101 3.1
4 20100101 4.1

A表的ID=B表的ID,想得到如下结果

1 A1 20100101 1.1 (B表中ID=1的有两条,为什么取的是这一条?)
2 A2 20100101 2.1
3 A3 NULL NULL (表B中,难道你找不到一条ID=3的?)



问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧
xiaozhou1121 2011-01-14
  • 打赏
  • 举报
回复
不好意思,怪我没说清。
A表
ID NAME TYPE
1 A1 1
2 A2 1
3 A3 1
4 A4 2

B表
ID DATE DATA
1 20100101 1.1
1 20100102 1.2
2 20100101 2.1
2 20100102 2.2
3 20100101 3.1
4 20100101 4.1


A表的ID=B表的ID,想得到如下结果

1 A1 20100101 1.1
2 A2 20100101 2.1
3 A3 NULL NULL
现在的语句
SELECT A.ID, A.NAME, B.DDATE, B.DDATA
FROM A LEFT OUTER JOIN
B ON A.ID = B.ID
WHERE (A.TYPE = 1) AND (B.DDATE = 20100102)只能得到两条记录
1 A1 20100102 1.2
2 A2 20100102 2.2
还少一条
mysqldbd 2011-01-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 xiaozhou1121 的回复:]
A表
ID NAME
1 A1
2 A2
3 A3

B表
ID DATE DATA
1 20100101 1.1
2 20100102 1.2

A表的ID=B表的ID,B表比A表少一条记录,想得到如下结果

1 A1 20100101 1.1
2 A2 20100101 1.2
3 A3 20100101 NULL (或0)
[/Quote]

大体框架是用 left join就ok了!

create table test.A select 1 as ID ,'A1' NAME union all select 2, 'A2' union all select 3, 'A3';

create table test.B select 1 ID , '20100101' DATE, '1.1' DATA union all select 2, '20100102','1.2';

select a.id,a.name,b.date,b.data
from test.A a left join test.B b
on a.id=b.id;
mysqldbd 2011-01-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 acmain_chm 的回复:]
1 A1 20100101 1.1
2 A2 20100101 1.2 这里为什么不是 20100102 ?
3 A3 20100101 NULL (或0) 这个20100101怎么来的?
[/Quote]

同问,同问!
zuoxingyu 2011-01-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaozhou1121 的回复:]
我也是这样写的,不行呀。 只是在SQL2000下运行的
[/Quote]

left join ,左连接。
小小小小周 2011-01-08
  • 打赏
  • 举报
回复
用left join 就可以了
ACMAIN_CHM 2011-01-08
  • 打赏
  • 举报
回复
mysql> select * from a;
+------+------+
| id | name |
+------+------+
| 1 | A1 |
| 2 | A2 |
| 3 | A3 |
+------+------+
3 rows in set (0.02 sec)

mysql> select * from b;
+------+----------+------+
| id | DATE | DATA |
+------+----------+------+
| 1 | 20100101 | 1.1 |
| 2 | 20100102 | 1.2 |
+------+----------+------+
2 rows in set (0.00 sec)

mysql>
mysql> select *
-> from a left join b using(id);
+------+------+----------+------+
| id | name | DATE | DATA |
+------+------+----------+------+
| 1 | A1 | 20100101 | 1.1 |
| 2 | A2 | 20100102 | 1.2 |
| 3 | A3 | NULL | NULL |
+------+------+----------+------+
3 rows in set (0.04 sec)

mysql>
ACMAIN_CHM 2011-01-08
  • 打赏
  • 举报
回复
1 A1 20100101 1.1
2 A2 20100101 1.2 这里为什么不是 20100102 ?
3 A3 20100101 NULL (或0) 这个20100101怎么来的?
xiaozhou1121 2011-01-08
  • 打赏
  • 举报
回复
SELECT db.ID, dnl.日期, dnl.ZYZ
FROM [档案] db LEFT OUTER JOIN
数据 dnl ON db.ID = dnl.ID
WHERE (dnl.日期 = 20100102)

这是我写的SQL语句,但结果不对。
xiaozhou1121 2011-01-08
  • 打赏
  • 举报
回复
我也是这样写的,不行呀。 只是在SQL2000下运行的
rucypli 2011-01-08
  • 打赏
  • 举报
回复
select A.id,A.name,B.date,B.data
from A left join B on A.id = B.id

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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