如何使用内部联接修复"ambigous column name error"错误

Zac*_*Zac 1 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>
Run Code Online (Sandbox Code Playgroud)

这里也提出了问题

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

BCl*_*don 6

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


Sales_Data
------------------
Check_ID    Tender_Amt  Closed_DateTime Emp_ID
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

SELECT *
FROM Employee E 
    INNER JOIN Sales_Data SD ON E.Emp_ID = SD.Emp_ID
Run Code Online (Sandbox Code Playgroud)

编译器将其视为:

**Emp_ID**, Emp_Name, Emp_DOB, Emp_Hire_Date, Emp_Supervisor_ID, 
Check_ID, Tender_Amt, Closed_DateTime, **Emp_ID**
Run Code Online (Sandbox Code Playgroud)

由于它尝试从两个表中获取所有列,因此Emp_ID是重复的,但SQL不知道哪个Emp_ID来自哪个表,因此您使用内部连接得到"模糊列名称错误".

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

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

- 编辑:我清理了示例并更改了"SELECT*从第一个表中拉出所有列"到"SELECT*从两个表中拉出所有列".肖恩指出我不正确.