【问题标题】:Exact match of column data to be retrieved要检索的列数据的精确匹配
【发布时间】:2014-08-15 14:39:13
【问题描述】:

我有一个场景,只有当两个不同表中的两列需要完全匹配时,我才需要检索记录

Table A
--------
Column1 Column2
Item1    Code1
Item1    Code2
Item1    Code3
Item1    Code4

Table B
-------

Column1 Column2 Column3
Item2   Code1    10
Item2   Code2    10
Item2   Code3    10
Item2   Code4    10

Item3   Code1    10
Item3   Code2    10
Item3   Code3    10    

现在,只有当两个表中 Column2 中的所有值都匹配时,我才需要从表 B 中获取第 3 列。应忽略第 3 项,因为并非表 B 中的 column2 的所有值都与表 A 的第 2 列匹配

我期待的最终结果是

Column1 Column2 Column3
Item1   Code1    10
Item1   Code2    10
Item1   Code3    10
Item1   Code4    10

请对此 SQL 提出建议。

【问题讨论】:

  • 为什么你的标签中有多个数据库?
  • 如果 item3 确实有 code4 怎么办?你应该看到 item1 8 次吗?
  • 项目 1 应该有 20 作为代码 1 的 column3 的值
  • @user3723562 基于您的评论“项目 1 应该有 20 作为代码 1 的 column3 的值”我认为您确实需要重新考虑您的问题......因为 wat
  • @Kritner no op 只想显示与特定不同项目具有的“代码”数量匹配的项目的相应列 3

标签: mysql sql oracle join inner-join


【解决方案1】:

尝试使用子查询进行内部连接。have 子句是这里的关键,以确保它匹配所有 4 个条件。

查询

SELECT a.*, b.column3 
FROM tablea a
JOIN tableb b on b.column2 = a.column2
WHERE b.column1 IN
(   SELECT b.column1
    FROM tableB b
    WHERE b.column2 in(select column2 from tablea)
    GROUP BY b.column1
    HAVING COUNT(*) = 4
);

DEMO

输出

Column1 Column2 Column3
Item1   Code1   10
Item1   Code2   10
Item1   Code3   10
Item1   Code4   10

注意:

如果您实际上不知道特定项目的代码数量,您也可以像这样使其动态化。

SELECT a.*, b.column3 
FROM tablea a
JOIN tableb b on b.column2 = a.column2
WHERE b.column1 IN
(   SELECT b.column1
    FROM tableB b
    WHERE b.column2 in(select column2 from tablea)
    GROUP BY b.column1
    HAVING COUNT(*) = (SELECT count(*) from tablea where column1 = 'Item1')
);

所有你需要知道的是你想要匹配的产品..也就是哪个项目

【讨论】:

  • 内部连接将导致为 code1/code2/code3 检索项目 3 以及正确
猜你喜欢
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2013-07-19
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
相关资源
最近更新 更多