【问题标题】:INNER JOIN Statement returns multiple rows instead of oneINNER JOIN 语句返回多行而不是一行
【发布时间】:2021-09-12 12:14:46
【问题描述】:

有两个表,分别是skucountry,没有任何匹配的列。我需要根据sku 表中c_code 的值从国家表中检索一个唯一字段printable_name。 c_code 列有多个相同的国家代码(例如:124),而国家表中的 numcode 列包含相同的国家代码但只有一次,因为它是唯一的字段。具有唯一 numcode 的行具有我最终尝试检索的国家/地区名称。下面我的 SQL 查询的结果给出了多行而不是国家表中的一行。我只想要国家表中的一条记录,即printable_name

我正在尝试将以下 SQL 与 JOIN 语句合并为一个。

$vendor_sku = $my_line_item['sku'];
                        
                        // Build SQL to retrieve country name.
                        $sql = "SELECT c_code FROM sku WHERE item_sku = '" . $vendor_sku . "'";
                        $sql = "SELECT printable_name FROM country WHERE numcode = '" . $c_code . "'";

SELECT country.printable_name
  FROM country INNER JOIN sku ON country.numcode = sku.c_code
 WHERE country.numcode = "124"

我的国家/地区表的一部分是:

sku 表的一部分是:

Country 表中只有一个 numcode 124 条目,如下所示。

【问题讨论】:

  • 当sku表有多个相同的国家num_code的c_code时会发生。
  • SELECT 之后添加DISTINCT 以过滤掉重复项
  • 请提供样本数据和期望的结果。
  • 请看帖子中添加的表格图片。

标签: mysql sql database inner-join


【解决方案1】:

试试:

SELECT a.printable_name
  FROM country a
 WHERE
 1=1
 and a.numcode = '124'
 and exists (select 1 from sku s where a.numcode = s.c_code)

【讨论】:

  • @Mizab,完美。这只返回了我想要的一个字段。如果可能的话,我希望简化一下。我仍然是 SQL 的初学者。谢谢
  • @CodeForGood。很高兴我能帮助你。我不建议在您的情况下使用联接,因为当 sku 表中的 c_code = '124' 的记录多于一条时,您有增加行的风险。存在是函数是有效的解决方案,值得了解。它正在检查 sku 表中是否存在 a.numcode = s.c_code 的行。我选择 1 而不是任何特定的列,因为它不会影响函数结果 - 我只是检查是否有任何符合我的条件的行。
【解决方案2】:

我只想要国家表中的记录

那你为什么要使用sku 表呢?

SELECT c.printable_name
FROM country c
WHERE c.numcode = 124;

注意:我假设 124 是一个 数字,所以我删除了引号。如果是字符串,则使用带单引号的字符串,'124'

【讨论】:

  • OP 的查询还检查sku...中是否存在至少一个相关行...
  • @Akina 。 . .我实际上希望OP对此进行解释。在提出的问题中(至少对我而言)不清楚。
  • 请查看我更新的帖子,以更好地了解我想要做什么。我基本上是在尝试使用 JOIN 将两个 SQL 语句组合成一个。
  • @CodeForGood 。 . .如果您想要代码为 124 的国家/地区名称,则不需要 sku 表。
  • 我明白你在说什么。代码 124 是用于测试目的的硬编码数字。这个国家代码是早先从 sku 表中检索到的。
猜你喜欢
  • 2020-11-29
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 2018-11-17
  • 1970-01-01
相关资源
最近更新 更多