【问题标题】:SQL query tables aliases [duplicate]SQL查询表别名[重复]
【发布时间】:2015-09-28 21:46:39
【问题描述】:

有没有办法为 SQL 查询的数据表命名/别名?

即:

SELECT TOP 10 * FROM Table_MOON;
SELECT TOP 10 * FROM Table_SUN;

当您将其加载到数据集“ds”中时,即在 VB.NET 中,它变为:

ds.table(0)
ds.table(1)

有没有办法在 SQL 查询中给表起别名,以便可以像这样调用表:

ds.table("Table_MOON")
ds.table("Table_SUN")

问题是,当 table(0) 什么都不是,那么 table(1) 就变成了 table(0)...

我没有在谷歌上搜索任何关于这件事的信息,因为涉及的关键字太笼统了。

编辑: 请注意,我们的想法是将其保存在一笔交易中。 此外,由于嵌套和潜在的高处理时间,通过数据行方法(添加具有数据表名称的列)的迭代是不可接受的。

问候,

Libor

【问题讨论】:

    标签: sql sql-server vb.net


    【解决方案1】:

    是的,你可以。

    SqlConnection connection = new SqlConnection("Data Source=localhost; Initial Catalog=myDatabase; Trusted_Connection=true;User Id=;Password=");
    connection.Open();
    
    string sqlUsers = @"select * from Users";
    string sqlRoles = @"select * from Roles";
    
    SqlDataAdapter daUsers = new SqlDataAdapter(sqlUsers, connection);
    SqlDataAdapter daRoles = new SqlDataAdapter(sqlRoles, connection);
    
    DataSet dsUsersAndRoles = new DataSet("UserAndRoles");
    
    daUsers.Fill(dsUsersAndRoles, "users");
    daRoles.Fill(dsUsersAndRoles, "roles");
    
    var userTable = dsUsersAndRoles.Tables["users"];
    

    您可以在填充数据集时指定名称。

    注意:这段代码是 c#,但我想它应该很容易转换。

    这是converter,以防万一。

    更新

    您可以使用SqlDataAdapterTableMappings 集合来映射查询表达式中的每个表:

    SqlConnection connection = new SqlConnection("Data Source=localhost; Initial Catalog=myDatabase; Trusted_Connection=true;User Id=;Password=");
    connection.Open();
    
    string sqlUsersRoles = @"select * from UserLogins;select * from Users;select * from Roles";
    
    SqlDataAdapter daUsersRoles = new SqlDataAdapter(sqlUsersRoles, connection);
    
    daUsersRoles.TableMappings.Add("Table", "UserLogins");
    daUsersRoles.TableMappings.Add("Table1", "Users");
    daUsersRoles.TableMappings.Add("Table2", "Roles");
    
    DataSet dsUsersAndRoles = new DataSet("UserAndRoles");
    
    daUsersRoles.Fill(dsUsersAndRoles);
    
    DataTableCollection tables = dsUsersAndRoles.Tables;
    
    DataTable users = tables["Users"];
    

    如您所见,我的 Sql 语句包含对 3 个表的 3 个查询。 表命名为TableTable1Table2 等等。

    您可以重命名它们,将元素添加到集合中:

    daUsersRoles.TableMappings.Add("Table", "UserLogins");
    daUsersRoles.TableMappings.Add("Table1", "Users");
    daUsersRoles.TableMappings.Add("Table2", "Roles");
    

    【讨论】:

    • 对不起,我没有指定我认为自然的一件事:我想在一个事务中拥有表(这是一种正确的方法)。我在您的示例中看到了两个单独的事务......我在一个进程中有多达 15 个数据表,每个都有许多连接,我认为这已经是非常糟糕的设计。
    • @user3260548:您可以找到我的答案的更新。
    • 我明白你的意思,我会试试看。这似乎是一个正确的答案,我一试就标记它。我特别想看看如果第一个或第二个表什么都没有会发生什么......“角色”应该留在 Table2,而不是跳到 Table1。
    • 我不太明白为什么你的表应该是 Nothing。给我们一些反馈。干杯。
    • 好的,一个简单的例子是一个Item,它可能包含几种类型的子项。每种类型的子项都列在一个单独的表中,并且可能有 0 行(没有子项)。但是仔细查看您的代码,它应该可以工作。出现的另一个问题是,我在单独的数据访问层中具有该功能,并且对于所有查询都是通用的,我必须考虑是否可以使其正常工作,并使用任意数量的表。跨度>
    【解决方案2】:

    我从 SQL 查询中直接知道你不能这样做,但你可以手动命名它们:

    ds.table[0].TableName = "Table_MOON";
    

    【讨论】:

    • :-)。但是您需要知道 Table(0) 是您不知道的“Table_MOON”。我写了一个示例来解释,我需要它来识别表,以便 (1) 不会跳转到 (0),在这种情况下,第一个数据表中有错误的数据,而第二个数据表中没有数据。这就是为什么这不是一个 VB.NET 问题,而很可能只是 SQL,因为我想知道是否可以向查询表添加别名。还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多