【问题标题】:Retrieving data from joined tables从连接表中检索数据
【发布时间】:2011-07-29 22:19:10
【问题描述】:

我有 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") 中搜索正确的语法,但找不到任何内容。请问有人可以对此有所了解吗?非常感谢。

问候, 理查德

【问题讨论】:

  • “列太多”是你的理由吗?您知道大多数 IDE 和一些 3rd 方工具可以让实现列列表变得轻而易举,对吧?

标签: c# sql sql-server join


【解决方案1】:

如果我正确理解您的问题,您就有一个保存查询结果的 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】:

    在查询中显式选择列应该可以解决这个错误(更不用说,一个整体的好习惯)

     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 作为列名查询到数据表中,但我不太记得

    【讨论】:

    • 谢谢。这做到了。我最终将列作为变量输入到函数中,默认为 *,所以我可以指定 p.ID AS ID、r.Name AS Name、n.Description AS Description 等,然后使用 Rows[i]["ID| Name|Description"] 获取列。它现在运行得很好,这个网站比原来的网站快一百倍:)
    【解决方案3】:

    我认为您想要的是选择 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"]

    【讨论】:

      【解决方案4】:

      Rows[i]["ID"] 应该没问题,只要您只从具有 ID 列的单个表中选择

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-22
        • 1970-01-01
        • 2023-04-09
        • 2021-10-03
        • 1970-01-01
        • 2011-03-10
        • 1970-01-01
        相关资源
        最近更新 更多