从连接表中检索数据

时间:2011-07-29 22:19:10

标签: c# sql sql-server join

我有3个表,X,Y和Z,其中X引用了Y和Z中的ID;我有以下查询输出X中存在Y ID和Z ID的所有行:

SELECT * FROM X INNER JOIN Y ON X.Y_ID = Y.ID INNER JOIN Z ON X.Z_ID = Z.ID

不幸的是,选择X.ID AS ID等不是一个选项,因为列太多了。

我完全运行此查询,但我使用dt.Rows[i]["X.ID"],其中dt是上述查询的DataTable表示,尝试检索表X中的ID,但它抛出异常(列'X .ID'不属于表DefaultView。)。

我已尝试在列名字符串(“X.ID”)中搜索正确的语法,但无法找到任何内容。有人可以对此有所了解吗?非常感谢提前。

此致 理查德

4 个答案:

答案 0 :(得分:2)

明确选择查询中的列应修复此错误(更不用说,总体良好做法)

 SELECT X.ID, X.NAME, X.[COLUMN], x.[ETC] FROM X INNER JOIN Y ON X.Y_ID = Y.ID INNER JOIN Z ON X.Z_ID = Z.ID

然后你可能只需要将ID作为列名查询到数据表,但我不记得了

答案 1 :(得分:2)

如果我理解你的问题,你有一个DataTable来保存你的查询结果:

SELECT * FROM X INNER JOIN Y ON X.Y_ID = Y.ID INNER JOIN Z ON X.Z_ID = Z.ID

然后,您希望根据表X中的ID列从DataTable中选择一行。

您可以按顺序引用ID列(它在列集合中的数字位置)。例如,如果ID列是SELECT语句的结果集中的第一列,则可以执行以下操作:

Convert.ToInt16(dt.Rows[i][0]); // Assuming ID is an int column

修改 重新阅读你的问题,你说“X.ID AS ID等等不是一个选项,因为有太多列”。所以如果那是你的坚定立场,你可以忽略我下面的答案的后半部分。

或者,正如jdmonty所说,你可以明确地选择列。我想补充一点,如果表中的列名通用,你也应该为列名添加别名,如下所示:

SELECT x.ID AS ID, x.NextColumn AS NextColumn
FROM   x 
INNER JOIN Y y ON x.Y_ID = y.ID
INNER JOIN Z z ON x.Z_ID = z.ID

您甚至可以使用别名点列(例如y.ID)表示法从连接表中选择列。

然后您可以按名称引用该列:

Convert.ToInt16(dt.Rows[i]["ID"]); // Assuming ID is an int column

答案 2 :(得分:1)

我认为你想要的是选择x中的所有列,但是从y和z中排除列。

  

SELECT X. * FROM X INNER JOIN Y ON X.Y_ID = Y.ID INNER JOIN Z ON X.Z_ID =   Z.ID

然后在数据表中按名称引用该列。数据表不知道数据库端使用的X别名。

dt.Rows [I] [ “ID”]

答案 3 :(得分:0)

只要您从只有ID列

的单个表中进行选择,行[i] [“ID”]应该没问题