【问题标题】:Unmatched rows with values from both tables两个表中的值不匹配的行
【发布时间】:2019-01-17 13:23:22
【问题描述】:

我有两张桌子 T1:

+----+-----+--------------------+----------+
| ID | emp |     manager        |     proj |
+----+-----+--------------------+----------+
|  1 | Sam |     Tom            |       aa |
|  1 | Sam |     Tom            |       bb |
|  1 | Sam |     Tom            |       cc |
|  1 | Sam |     Tom            |       dd |
+----+-----+--------------------+----------+

表 T2:

+--------+---------+--------+-----------+
| Course |  Type   | proj   | Category  |
+--------+---------+--------+-----------+
| XYZ    |     NEW |     aa |    a      |
| DWE    |     OLD |     bb |    b      |
| RTY    |     OLD |     ii |    c      |
| UIO    |     NEW |     gg |    d      |
+--------+---------+--------+-----------+

输出:

+-----------+-----+----------+--------+---------+---------+----------+
|    ID     | emp |  manager |  proj  | Course  |  Type   | Category |
+-----------+-----+----------+--------+---------+---------+----------+
|         1 | Sam |  Tom     |     ii |     RTY |     OLD |     c    |
|         1 | Sam |  Tom     |     gg |     UIO |     NEW |     d    |
+-----------+-----+----------+--------+---------+---------+----------+

我有一个常见的 col 项目,表 1 的项目由 emp 完成,table2 的项目由 emp 完成和没有由 emp 完成,并带有额外的字段。我想从 table2 中获取所有不匹配的行,但具有上面表 1 中的属性。有人可以通过 SQL 查询来帮助执行此操作吗?

【问题讨论】:

  • 输出是你想要的还是你目前得到的?如果它不是你想要的,你可以添加它吗?
  • 员工Sam 和经理Tom 被带入预期输出的逻辑是什么?该信息来自第一个表,但根据定义,第二个表与该表没有任何关系。
  • 这不能回答我的问题。
  • 数据库模型太乱了。投票结束。
  • @philipxy 很棒的评论。但是,如果问题显然可以回答,为什么您不发布答案?

标签: sql sql-server oracle join


【解决方案1】:

试试这个

with a as (
select T2.* from T1 right join T2 
on T1.proj=T2.proj
where T1.proj is null) ,

 b as (select T1.id, T1.emp, t1.manager from T1 left join T2 
on T1.proj=T2.proj
group by T1.id, T1.emp, t1.manager,T2.proj
having T2.proj is null)

select * from a cross join b

【讨论】:

  • 我认为这是不对的。他想要一个反连接,而不是外连接。
  • @TheImpaler 您可以建议如何改进设计,而不是选择关闭!我可以修改 table1 但不能修改 table 2
  • @my_way 希望你在我修改后得到输出
【解决方案2】:
select e.ID, e.emp, e.manager, t2.proj, t2.Course, t2.Type as Name, t2.Category
from t2
cross join (select distinct ID, emp, manager from T1) e
where not exists(select * from t1 where t1.prog=t2.proj)

【讨论】:

  • 我正在使用 oracle,它给了我一个缺少关键字的错误,我们需要指定连接条件 'on' 吗?
  • 是的,你是对的——应该是交叉连接。我已经更新了查询。
【解决方案3】:

选择 tbl.ID、tbl.emp、tbl.manager、t2.proj、t2.Course、t2.Type 作为名称、t2.Category
从 ( 选择 t2.ID、t2.emp、t2.manager 从表 2 t2 不存在的地方(从 Table1 t1 中选择 1,其中 t1.proj = t2.proj) ) 表 交叉申请表1 t1

【讨论】:

  • 请阅读编辑帮助重新格式化代码并查看您的答案的格式化版本并单击编辑进行编辑。
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多