我有两个表要加入并用于填充数据表,我遇到列名冲突的问题:
----------- -----------
| Parent | | Child |
----------- -----------
| ParentID| | ChildID |
| Name | | ParentID|
| Value | | Name |
----------- | Value |
-----------
SQL语句(MySQL数据库,如果相关的话)
select p.*, c.* from parent p left join child c on c.ParentID = c.ChildID
我的适配器代码(C#):
var adapter = new MySqlDataAdapter(sql, DBConn);
adapter.Fill(table);
当我去阅读行时,我希望这样:
var parentName = row["p.Name"];
var childName = row["c.Name"];
相反,它产生了这个:
var parentName = row["Name"];
var childName = row["Name1"];
如何让列名使用别名?我觉得我错过了一些明显的东西,因为这似乎应该一直出现。
答案 0 :(得分:4)
由于name
是两个表的常用列名,因此您必须在查询中为其中任何一个提供别名。如果你没有提供一个,它会自动为重复的字段提供一个,在这种情况下附加一个“1”。
此外,c.
和p.
只是查询的内部别名,但它们不是返回列名称的一部分。
在您的SQL查询中添加别名(至少其中一个)
SELECT p.name as parent_name, c.name as child_name, ….
在您的C#代码中使用正确的列
var parentName = row["parent_name"];
var childName = row["child_name"];
答案 1 :(得分:1)
无论何时处理w / sql字符串,写出所有字段名称而不是使用*
总是一个很好的约定
在这种情况下,您的问题是您的查询中有name
两次,因此它会自动填充1以消除歧义。
请改为尝试:
select
p.ParentId,
p.Name as parent_name,
p.Value as parent_value
c.ChildId,
c.Name as child_name,
c.Value as child_value
from parent p left join child c on p.ParentID = c.ChildID
您的c#代码也需要反映这一点。
var parentName = row["parent_name"];
var childName = row["child_name"];
答案 2 :(得分:0)
如果你想在输出中使用唯一的列名,查询中的别名是为mysql知道你的意思
Select p.Name as ParentName, c.Name as ChildName .... etc
我当然不会依赖于Name1驱动程序,将您的查询更改为select c.*, p.*
,事情会变得精神错乱。