我正在从数据库中查询,使用两个表,并得到我的问题标题中描述的错误.在某些情况下,我需要查询的字段在表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列作为链接两者的数据.
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*从两个表中拉出所有列".肖恩指出我不正确.