0

我正在使用JOIN命令连接 SqlDataSource 中的两个表。

 <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:CS %>" 
        SelectCommand="SELECT UserName as UN, AboutMe, WebPage, Email FROM Users JOIN ProfileImages ON ProfileImages.UserName = Users.UN WHERE (UN = @UserName)" >
</asp:SqlDataSource>

在 MS SQL Server Management Studio 中,这个命令是可以的。但在 SqlDataSource 它返回错误 - Invalid column name 'UN' , Ambiguous column name 'UserName'

如何在 SqlDataSource 中为该命令设置别名以不返回这些错误?

4

3 回答 3

2

您的查询有点错误您使用别名 ia 错误的方式

第一:您可以在以下部分使用别名:

  • 字段。示例用户名为 UN
  • 表名:UserTable as US
  • 在按部分排序示例中:Order BY UN Desc

这是因为 sql 按以下顺序运行查询操作:

  1. FROM 子句
  2. WHERE 子句
  3. GROUP BY 子句
  4. HAVING 子句
  5. 选择子句
  6. ORDER BY 子句

所以因为FROM子句首先运行,sql 不知道SELECT子句中的别名

查看正确的查询

SELECT 
    UserName as UN,
    AboutMe,
    WebPage,
    Email 
FROM Users 
JOIN ProfileImages ON ProfileImages.UserName = Users.UserName 
WHERE (Users.UserName = @UserName)
于 2013-02-18T19:21:35.450 回答
1

我不是 SQL 专家,但如果 ProfileImages 和 Users 都包含“UserName”列,那么在您选择的列中,您需要指定从中提取 UserName 的表。所以像:

SELECT Users.UserName as UN, Users.AboutMe, Users.WebPage, Users.Email 
FROM Users
JOIN ProfileImages ON ProfileImages.UserName = Users.UserName 
WHERE (Users.UserName = @UserName)
于 2013-02-18T19:13:40.400 回答
0

您不能在 where 子句中使用列别名。

    SELECT UserName as UN, AboutMe, WebPage, Email 
    FROM Users usersAlias JOIN ProfileImages piAlias ON piAlias.UserName = usersAlias.UserName 
WHERE (usersAlias.UserName = @UserName)

当您查看执行顺序时,这是有道理的:

http://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/

由于执行的顺序是:这些阶段及其顺序如下:

  1. 在哪里
  2. 通过...分组
  3. 立方体 | 卷起
  4. 拥有
  5. 选择
  6. 不同的 10 订购方式
  7. 最佳

当这些被处理时(“from”(#1)和“on”(#2)和“where”(#4))..他们不知道“select”(#8)(又名, UN 的别名),select 子句中的列别名不能在 WHERE 和 FROM(和 ON)子句中使用。

于 2013-02-18T19:21:11.037 回答