如何使用内部联接修复“模糊列名称错误”错误

时间:2013-06-10 16:58:55

标签: sql coldfusion

我正在使用两个表从数据库中获取查询,并且我收到了问题标题中描述的错误。在某些情况下,我需要查询的字段在表A中,但其他字段在表B中。我动态创建要搜索的列(可以在表A或表B中),我的代码中的WHERE子句是导致错误。

是否有动态方法来解决此问题,例如,如果列在表B中,然后使用表B进行搜索,或者INNER JOIN是否应该修复此问题(目前不是)

表A 字段:id

表B 字段:id


SQL代码

SELECT *
FROM A INNER JOIN B ON A.id = B.id
WHERE 
<cfloop from="1" to="#listLen(selectList1)#" index="i">

    #ListGetAt(selectList1, i)# LIKE UPPER(<cfqueryparam cfsqltype="cf_sql_varchar" value="%#ListGetAt(selectList2,i)#%" />) <!---
                                                    search column name = query parameter

                                                    using the same index in both lists
                                                    (selectList1) (selectList2) --->
    <cfif i neq listLen(selectList1)>AND</cfif> <!---append an "AND" if we are on any but
                                                the very last element of the list (in that
                                                case we don't need an "AND"--->
</cfloop>

Question posed here too

我希望能够搜索表A 表B 中的任何其他字段,并将id列作为链接​​两者的数据。

3 个答案:

答案 0 :(得分:6)

Employee
------------------
Emp_ID  Emp_Name    Emp_DOB Emp_Hire_Date   Emp_Supervisor_ID


Sales_Data
------------------
Check_ID    Tender_Amt  Closed_DateTime Emp_ID

您引用的每一列都应该由表别名继续(但您已经知道了。)例如;

SELECT E.Emp_ID, B.Check_ID, B.Closed_DateTime
FROM Employee E 
    INNER JOIN Sales_Data SD ON E.Emp_ID = SD.Emp_ID

但是,当您选择all(*)时,它会尝试从两个表中获取所有列。让我们看看它会是什么样子:

SELECT *
FROM Employee E 
    INNER JOIN Sales_Data SD ON E.Emp_ID = SD.Emp_ID

编译器将其视为:

**Emp_ID**, Emp_Name, Emp_DOB, Emp_Hire_Date, Emp_Supervisor_ID, 
Check_ID, Tender_Amt, Closed_DateTime, **Emp_ID**

由于它尝试从两个表 Emp_ID 中获取所有列,但SQL不知道哪个Emp_ID来自哪个表,因此您使用内部联接获得“模糊列名称错误”

因此,您不能使用(*),因为两个表中存在的任何列名都不明确。可能你不想要所有的列。

此外,如果要通过cfloop向SELECT行添加任何列,则必须按表别名继续。

- 编辑:我清理了示例并更改了“SELECT *将所有列从第一个表中提取”到“SELECT *从两个表中提取所有列”。肖恩指出我不正确。

答案 1 :(得分:2)

你必须以这样的方式编写你的where子句,你可以说A.field_from_A或B.field_from_B。你总是可以通过A.field_from_A。

虽然,你真的不想说

SELECT * FROM A INNER JOIN B ON A.id=B.id where B.id = '1'

你想说

SELECT * FROM B INNER JOIN A ON B.id=A.id where B.id = '1'

如果尝试在where子句中使用联接表,则可能会遇到一些非常慢的查询。有时候它是不可避免的,但最好的做法是始终只在主表中调用where子句。

答案 2 :(得分:1)

组装select 1变量时,请添加表名或别名。换句话说,而不是类似于:

select1 = "fred,barney,wilma,pebbles";

使它类似于:

select1 = "a.fred,a.barney,b.wilma,b.pebbles";