3

所以我有这个问题,我需要一个 INNER JOIN 将我的图像表连接到我的产品表,并且我已经尝试指定每个列名称与表的连接,如下所示。当谈到我的 WHERE 语句时,这就是它变得棘手的地方。因为我需要将我的 ProductID 保存为一个名为 pid 的变量以用于其他代码隐藏目的。

SELECT * FROM ProductTBL p
INNER JOIN ImageTBL img on p.ProductID = img.ProductID 
WHERE (ProductID = @pid)

当我运行此代码时,它会告诉我 ProductID 是一个模棱两可的列名,当我尝试进一步指定我的 Where 语句时,如下所示:

WHERE (p.ProductID = @pid)

它会给我另一个错误,告诉我没有数据绑定到我从中取出数据的某些行。仅当我没有像上面那样指定 Where 语句时,才会出现此错误。

任何输入都将不胜感激:)

PS:如果有什么要说的,我正在运行 MSSQL。

4

4 回答 4

1

“不明确的列名”消息是 SQL Server 错误,您通过指定“WHERE p.ProductID = @pid”来修复它。是的,你需要 p。在 ProductID 前面,因为 ImageTBL 也有同名的列。

“没有绑定数据”错误不是来自 SQL。您现在有一个正确的 SQL 语句,但它显然没有返回任何记录,至少对于您正在运行它的 @pid 的值。

你是从一个试图对数据做某事的应用程序中调用它的,对吧?这就是“没有数据绑定”错误的来源。

您可以通过在 SQL Server Management Studio 查询窗口中运行 SQL 语句并为 @pid 插入所需的值来分离问题的两个部分。然后您可以在调试模式下运行您的应用程序,并检查它是否接收到您在 Management Studio 中看到的相同数据。这里有一个猜测:您的应用程序没有正确传递@pid,并且 SQL 语句正在返回 p.ProductID = '' 的记录。看看是不是这样。

于 2013-03-27T12:33:26.793 回答
1

我知道这样做的两种方法。第二种方式可能是推荐的方式(它应该运行得更快)。

方式1)

在两步语句中运行它。我认为您不能在内部 SELECT 语句中使用 * :

SELECT * FROM (
    SELECT p.ProductID, [other needed fields]
    FROM ProductTBL p
    INNER JOIN ImageTBL img on p.ProductID = img.ProductID
    ) as x
WHERE (ProductID = @pid)

内部 SELECT p.ProductID 表示从 ProductTBL 显式返回 ProductID。然后可以在 WHERE 语句中使用该 ProductID 字段,因为它位于外部 SQL 语句中。

方式2)

将“WHERE”标准作为连接的一部分

SELECT *
FROM ProductTBL p
INNER JOIN ImageTBL img on p.ProductID = img.ProductID AND p.ProductID = @pid
于 2013-05-10T15:38:23.773 回答
0

这可能是您的代码的问题。尝试使用产品 ID 的硬核值运行查询并在数据库控制台中运行它。

似乎不是数据库问题

于 2013-03-27T12:16:13.887 回答
0

好的,这是有问题的 where 语句。您需要在您的 productID 前面加上您的表别名。表别名'很好,我毫不怀疑你已经意识到,当你输入 SELECT * From MyTable T,然后返回选择你的列时,当你用 T 替换 * 时,你会得到一个列的智能列表。别名表是总是好的。假设您有两个表 T1 和 T2 以及 T1 中的 C1、C2、C3 和 T2 中的 C4、C5、C6 列。您编写存储过程的脚本并且它可以工作。稍后某个时候有人出现并将名为 C2 的 c 列添加到 T2,那么如果您没有在列上添加表名前缀,那么您的过程可能会中断。因此,即使当前没有歧义并且您永远不会更改存储的过程,使用前缀总是更健壮。

明确声明列而不是使用 * 总是一个好主意,因为再次添加列可能会破坏您的 proc,而且如果您的列名不正确,SSMS 会用红色的小波浪线在其下划线。

于 2013-03-27T12:46:34.903 回答