【问题标题】:Return rows from MYSQL table A where table_A.col_1 = table_b.col_2 without using a left outer join?从 MYSQL 表 A 中返回行,其中 table_A.col_1 = table_b.col_2 不使用左外连接?
【发布时间】:2020-08-05 16:40:39
【问题描述】:

在具有两个表 table_Atable_B 的 MySQL 数据库中,我想根据与 table_B 中的值的比较从 table_A 返回选定的行列。下面的错误行总结了这个想法:

SELECT col_1, col_2, col_3 FROM table_A where table_A.col_1 = table_B.col_2;

我不想要来自table_B 的任何元素。

为什么我不能使用左外连接:我已经尝试使用左外连接,如图所示 (https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/) 但是数据库抱怨列名不明确,并且更改数据库中的表列名称不是一种选择。

【问题讨论】:

  • 请显示您尝试的“不是一个选项”的外部连接。如果您不想要 tableB 中的列,为什么要左连接呢?
  • 我在这里做不到。代码太长了,并且透露了太多关于我正在处理的数据库的信息。这就是为什么我将它简化为上面的原因
  • 好吧,然后显示一个简化版本。并告诉我们,如果您不想要 tableB 中的列,为什么要左连接?
  • 只看问题中的链接示例。
  • 我查看了,您的查询不存在。我认为您只需要限定列 - 请参阅我的答案...

标签: mysql database join subquery


【解决方案1】:

我想要table_A 中的行,其col1 可以在table_B(col_2) 中找到,你可以使用exists

select a.col_1, a.col_2, a.col_3 
from table_A a 
where exists (select 1 from table_B b where b.col_2 = a.col_1);

如果您想要table_B 中不存在的行,则只需将exists 更改为not exists

请注意,我在列名前加上它们所属的表(别名)。这称为限定列,这是您避免在尝试join 时似乎遇到的列名不明确问题的方法。

【讨论】:

  • 上述方法在选择语句中没有别名表的情况下工作。尽管别名对于语句的 where exists 部分是必需的。考虑到我在实际工作的表中选择了很多元素,这很有用。谢谢!
【解决方案2】:

如果列名不明确,请限定它们,例如

select table_A.col_1, table_A.col_2, table_A.col_3
from table_A
join table_B on table_A.col_1 = table_B.col_2

或者为简洁起见,您可以为表分配别名:

select a.col_1, a.col_2, a.col_3
from table_A a
join table_B b on a.col_1 = b.col_2

【讨论】:

    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 2011-06-10
    • 2014-12-23
    • 1970-01-01
    • 2017-09-28
    • 2020-07-18
    • 2014-01-16
    • 1970-01-01
    相关资源
    最近更新 更多