数据库方面的问题!

seaman0220 2005-03-22 11:28:09
有如下两张表:

表A:
字段名:a1、a2、a3、a4
值: 1 1 a b
2 2 c d

表B:
字段名:b1、b2
值: 1 m
1 n
2 j
2 k

表A的a2和表B的b1是关联的。

现在我想取出表A的所有字段值(其中表A的a2字段取出的是b2)

这样的SELECT的语句应该怎么样写啊?

我想实现的效果为:
字段名:a1 a2 a3 a4
值: 1 m,n a b
2 j,k c d
...全文
156 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
simon0220 2005-03-25
  • 打赏
  • 举报
回复
楼主,还有用程序实现吧,我大概知道你想实现什么功能,我这里有份代码,是C#的,看看对你有没有帮助.联系我!
mooniscrazy 2005-03-23
  • 打赏
  • 举报
回复
一定不能使用在循环中查询的方法,那样很容易死机。
mooniscrazy 2005-03-23
  • 打赏
  • 举报
回复
建立一个这样的对象
public class A{
public string a1{get;set;}
public string a2{get;set;}
public string a3{get;set;}
public string a4{get;set;}
public ArrayList SubItems{get;set;}//存放所有相关的B
public string GetJoinedB();//将存放的所有的B拼接成字符串输出
}
public class B{
public string b1{get;set;}
public string b2{get;set;}
}
自制一个IDictionary 作为A的容器AContainer,此IDictionary会忽略重复的键,类似于Session
查询A表和B表的连接,取出每条记录放入A对象,再将A对象放入Container,以A.a2作为key,象这样:
IDictionary AContainer=new xxx();
AContainer.Add(A.a2,A);
然后取出与B相关的字段,放入B对象。在A的容器中找到B应该属于的A,将B加入A的SubItems集合
B b=xxxx....;
((A)(AContainer[b.b2])).SubItems.Add(b);
然后依次调用AContainer中A的属性和方法就搞定了。

jhtchina 2005-03-22
  • 打赏
  • 举报
回复
我想想,关注。]
回复人: hedonister(冰戈) ( ) 信誉:100 说的很对。用用过程化的sql语句行吧
hedonister 2005-03-22
  • 打赏
  • 举报
回复
用程序实现吧,很简单的
咖啡老猫 2005-03-22
  • 打赏
  • 举报
回复
用 inner join 也行啊!!!
seaman0220 2005-03-22
  • 打赏
  • 举报
回复
我对SQL不太精通,应该怎么写呢?
hedonister 2005-03-22
  • 打赏
  • 举报
回复
用过程化的sql语句行吧?简单的sql语句肯定没办法实现
seaman0220 2005-03-22
  • 打赏
  • 举报
回复
是的,我就是这个意思!麻烦hedonister(冰戈)了!
hedonister 2005-03-22
  • 打赏
  • 举报
回复
总算明白楼主的意思了,

效果为:
字段名:a1 a2 a3 a4
值: 1 m,n a b
2 j,k c d

是m,n和j,k是吧?

等会来拿答案,考虑下
seaman0220 2005-03-22
  • 打赏
  • 举报
回复
那请问问题出在什么地方呢?
jhtchina 2005-03-22
  • 打赏
  • 举报
回复
select A.*,B.b2
from A left join B on A.a2=B.b1
出现的行数是
select count(*)
from A
hedonister 2005-03-22
  • 打赏
  • 举报
回复
呵呵,我仔细看了下你的

表B:
字段名:b1、b2
值: 1 m
1 n
2 j
2 k

本来就是有问题的嘛,怎么会出现这种奇怪的情况?
seaman0220 2005-03-22
  • 打赏
  • 举报
回复
大家给的答案都是一个效果,出现了多行啊!
hedonister 2005-03-22
  • 打赏
  • 举报
回复
我晕,怎么是、?改成,吧
select a1,b2,a3,a4 from 表a
left join 表b on 表b.b1=表a.a2

还有这种情况最好不用等值连接(也就是select a1,a3,a4,b.b2 as a2 from a,b where a.a2=b.b1
),速度问题,你去查询分析器看看执行成本就知道了
jhtchina 2005-03-22
  • 打赏
  • 举报
回复
select A.*,B.b2
from A left join B on A.a2=B.b1
hedonister 2005-03-22
  • 打赏
  • 举报
回复
select a1、b2、a3、a4 from 表a
left join 表b on 表b.b1=表a.a2

肯定行了,楼主揭贴
gshope 2005-03-22
  • 打赏
  • 举报
回复
select a1,a3,a4,b.b2 as a2 from a,b where a.a2=b.b1
seaman0220 2005-03-22
  • 打赏
  • 举报
回复
表B是没有主键的
我按照你讲的方法做过,但是取出的确实两条记录例如:
1 m a b
1 n a b
2 j c d
2 k c d
rickjelly2004 2005-03-22
  • 打赏
  • 举报
回复
left join
加载更多回复(3)

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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