我正在使用两个表从数据库中获取查询,并且我收到了问题标题中描述的错误。在某些情况下,我需要查询的字段在表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>
我希望能够搜索表A 和表B 中的任何其他字段,并将id列作为链接两者的数据。
答案 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";