当前位置: 首页 > 面试题库 >

如何使用内部联接修复“歧义列名错误”

马欣德
2023-03-14
问题内容

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

这里也提出了问题

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


问题答案:
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 从两个表中拉出所有列”。肖恩指出我不正确。



 类似资料:
  • 这个简单的查询没有意义,但它是我试图运行的查询的一个简单版本。这应该是没有错误的运行,对吧?如果我删除别名,它运行没有问题… 提前致谢

  • 我有以下数据帧: 尝试使用spark-sql进行连接,如下所示 给出错误为: 我在这里做错了什么,如何修复?

  • 所以我有一个相关的子查询,我读到这不是最有效的方法。因此,我想将此查询转换为内部联接查询。 我试过这样的方法: 在对数据库“db”执行SQL查询时导致 我在这里的所有搜索结果都产生了大致相同的查询(与我尝试的类似)

  • 我试图在一列内连接两个表。从数据库方面来看,没有映射,因为这是我不想讨论的事情。 我想使用内部联接执行HQL查询并检索角色对象/结果。 这是到目前为止我的hql 一场createQuery(“从角色作为角色内部加入参与作为角色上的参与。id=invention.roleid,其中invention.id=X”)。list(); 我看到在HQL上不可用。如何明确地告诉Hibernate仅加入此列。

  • 我想在SQL Server2008中使用进行删除。 但我得到了这个错误: 消息156,级别15,状态1,第15行 关键字“inner”附近的语法不正确。 我的代码:

  • 问题内容: 我试图了解如何创建查询以基于内部联接过滤掉一些结果。 考虑以下数据: 我想选择project_id为1的所有composition_batch记录,并具有component_id为1或2的composition_batch_component。因此,我运行以下查询: 但是,这将返回重复的条目: 有没有一种方法可以修改此查询,以便仅获取与条件匹配的唯一composition_batch记