2012-04-11 185 views
0

我正在使用C#(asp.net)。我有两个表(数据和细节)在同一个数据库中。从两个不同表中提取数据库中的数据

表 “数据”

id | chap | unit | 
    ---------------- 
    1| chap1|unit1 | 
    2| chap2|unit2 | 
    3| chap3|unit3 | 

表 “方式”

id| code| num | 
---------------- 
1|abc |2 | 
2|efg |3 | 
3|hij |1 | 

现在我想取从 “NUM”,其中代码= “EFG”(在表 “方式”)的值。并使用相同的值(3)通过id从表“data”中获取数据。我正在使用此代码。

OleDbConnection conn = new OleDbConnection(*** ...... *****); 
     OleDbCommand cmd; 
     OleDbDataReader reader; 
     String query = String.Format("select num from details where code="efg"); 
     cmd = new OleDbCommand(query, conn); 
     reader = cmd.ExecuteReader(); 
     int num = int.Parse(reader.GetValue(0).ToString()); 

     query = String.Format("select chap from data where id={0}",num); 
     cmd = new OleDbCommand("select lesson from data where id=3", conn); 
     reader = cmd.ExecuteReader(); 


     Label1.Text = reader.GetValue(0).ToString(); 

但它显示错误。它显示“没有数据存在行/列”。

回答

2

您可以使用

SELECT d.chap, d.unit 
FROM data d INNER JOIN details de 
    ON d.id = de.num 
WHERE de.code = 'efg' 

SELECT d.chap, d.unit 
FROM data d INNER JOIN details de 
    ON d.id = de.num 
    AND de.code = 'efg' 

更多:如果你使用SQL-Server中,代替OleDbConnection使用SqlConnection
更多:不要格式化您的查询加入字符串,数字,日期等;使用SqlParameter,所以你不必担心类型和格式!

+0

其实I M使用微软的数据库访问,这就是为什么我使用“的OleDbConnection”。对不起,我错误地标记了SQL Server。 – Sagar 2012-04-11 16:35:48

+0

@Viktor:我的答案解决了你的问题吗?如果是的话,你应该[接受它](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work),如果你认为它很好。 – Marco 2012-04-12 05:52:16

-1

或者你可以使用子查询

SELECT * FROM data INNER JOIN 
    (SELECT num FROM details WHERE code='efg') det 
ON data.id = det.num 
+0

这是一个非常糟糕的做法。我没有降低这个...但是这很糟糕... – Marco 2012-04-11 14:23:13

+0

由于查询优化器的原因,这个查询与您在回答中提供的两个问题完全相同,当涉及到执行时。不相关的是这里的关键字。实际上,我们提供了三种不同的方法来使SQL执行完全相同的任务(执行计划可以确认这一点)。 Downvoter可能对优化程序的工作原理没有任何线索。 – Alex 2012-04-11 15:16:52

+0

亚历克斯,我想告诉你的不是那个查询本身是错误的,也不是查询optmizer不会在我的同一个查询中翻译它;我相信你明白像OP这样的新手必须更简单和*默认*的方式来编写查询,因为他无法理解执行计划是什么或查询优化器如何工作:)你同意我吗? – Marco 2012-04-11 17:41:46

相关问题