1

我正在使用两个表从数据库中进行查询,并收到问题标题中描述的错误。在某些情况下,我需要查询的字段在表 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 列作为链接​​两者的数据。

4

3 回答 3

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

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

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 * 从两个表中提取所有列”。肖恩指出我错了。

于 2013-06-10T18:06:35.303 回答
2

You have to write your where clause in such a way that you can say A.field_from_A or B.field_from_B. You can always pass A.field_from_A.

Although, you don't really want to say

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

You would want to say

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

You can get some really slow queries if you try to use a joined table in the where clause. There are times when it's unavoidable, but best practice is to always have your where clause only call from the main table.

于 2013-06-10T17:09:06.103 回答
1

当您组装您的 select1 变量时,请添加表名或别名。换句话说,而不是类似这样:

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

使它类似于这样:

select1 = "a.fred,a.barney,b.wilma,b.pebbles";
于 2013-06-11T00:05:15.653 回答