我有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”)中搜索正确的语法,但无法找到任何内容。有人可以对此有所了解吗?非常感谢提前。
此致 理查德
答案 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”]应该没问题