使用一个表中的整数值在另一个 SQL 表中查找值

Posted

技术标签:

【中文标题】使用一个表中的整数值在另一个 SQL 表中查找值【英文标题】:use integer values in one table to look up values in another SQL table 【发布时间】:2020-06-25 18:09:13 【问题描述】:

我希望在一个表中使用整数值来查找另一个 SQL 表中的字符串值。 例如,我有两个表:

╔═════════╦═══════════╦═════════════════╦═══════════════════╗
║ CarType ║ CarColour ║ AbnormalCarType ║ AbnormalCarColour ║
╠═════════╬═══════════╬═════════════════╬═══════════════════╣
║       1 ║         1 ║ 1               ║ 2                 ║
║       1 ║         2 ║ null            ║ null              ║
║       2 ║         1 ║ 1               ║ 2                 ║
║       2 ║         2 ║ 1               ║ 1                 ║
╚═════════╩═══════════╩═════════════════╩═══════════════════╝

然后在我的另一个表中:

╔═══════════╦═══════════════╦═════════════╦═════════════════╦══╗
║ CarTypeId ║ CarTypeString ║ CarColourId ║ CarColourString ║  ║
╠═══════════╬═══════════════╬═════════════╬═════════════════╬══╣
║         1 ║ "Hyundai"     ║           1 ║ "Red"           ║  ║
║         1 ║ "Hyundai"     ║           2 ║ "Blue"          ║  ║
║         2 ║ "Toyota"      ║           1 ║ "Green"         ║  ║
║         2 ║ "Toyota"      ║           2 ║ "Yellow"        ║  ║
╚═══════════╩═══════════════╩═════════════╩═════════════════╩══╝

然后为输出

╔═════════╦═══════════╦═════════════════╦═══════════════════╗
║ CarType ║ CarColour ║ AbnormalCarType ║ AbnormalCarColour ║
╠═════════╬═══════════╬═════════════════╬═══════════════════╣
║ Hyundai ║ Red       ║ Hyundai         ║ Blue              ║
║ Hyundai ║ Blue      ║ null            ║ null              ║
║ Toyota  ║ Green     ║ Hyundai         ║ Blue              ║
║ Toyota  ║ Yellow    ║ Hyundai         ║ Red               ║
╚═════════╩═══════════╩═════════════════╩═══════════════════╝

我尝试了双重内连接,第一次是 CarType、CarColour,然后是 AbnormalCarType 和 AbnormalCarColour,但它没有产生我想要的结果。

非常感谢!

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT b.CarTypeString AS CarType, b.CarColourString AS CarColour, 
  c.CarTypeString AS AbnormalCarType, c.CarColourString AS AbnormalCarColour
FROM `project.dataset.tableB` b  
LEFT JOIN `project.dataset.tableA` a
ON b.CarTypeId = a.CarType AND b.CarColourId = a.CarColour
LEFT JOIN `project.dataset.tableB` c
ON a.AbnormalCarType = c.CarTypeId AND a.AbnormalCarColour = c.CarColourId 

如果适用于您示例中的示例数据

WITH `project.dataset.tableA` AS (
  SELECT 1 CarType, 1 CarColour, 1 AbnormalCarType, 2 AbnormalCarColour UNION ALL
  SELECT 1, 2, NULL, NULL UNION ALL
  SELECT 2, 1, 1, 2 UNION ALL
  SELECT 2, 2, 1, 1 
), `project.dataset.tableB` AS (
  SELECT 1 CarTypeId, 'Hyundai' CarTypeString, 1 CarColourId, 'Red' CarColourString UNION ALL
  SELECT 1, 'Hyundai', 2, 'Blue' UNION ALL
  SELECT 2, 'Toyota', 1, 'Green' UNION ALL
  SELECT 2, 'Toyota', 2, 'Yellow' 
)

输出符合预期

Row CarType CarColour   AbnormalCarType AbnormalCarColour    
1   Hyundai Red         Hyundai         Blue     
2   Hyundai Blue        null            null     
3   Toyota  Green       Hyundai         Blue     
4   Toyota  Yellow      Hyundai         Red  

【讨论】:

非常感谢您的回复!不幸的是,我的最小工作示例还不够好,这也不是我想要的。我已经编辑了我的开场白。如果您有时间再看一遍,那就太好了。 顺便说一句,与此同时,我根据您的新样本数据测试了给出的答案(假设 AbnormalCarColour 归档实际上应该是 CarColourString 与原始样本一样)并且它仍然有效。无论如何 - 请考虑上述建议 非常感谢再次回复并为之前道歉,以后发帖时会牢记。

以上是关于使用一个表中的整数值在另一个 SQL 表中查找值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle/SQL - 在另一个表中查找或为空或可能不存在或为空的记录

excel中判断一个表中的某一列的数据在另一个表中的某一列中是不是存在

从一个表中选择一个逗号分隔的值,并使用 SQL Server 中的函数在另一个表中的 where 条件中使用它

Microsoft Access 中的选择查询在另一个表中查找返回错误结果的记录

我想更新sql 表1中的某一列数值,这个数值是从另外一个表中取出来的。语句怎么写

将递增的整数值分配给mysql数据库中的列