根据特定列连接/合并来自两个非相关表的记录

时间:2018-06-03 16:23:10

标签: sql sql-server sql-server-2005 inner-join union

我有两张桌子:

  • 产品

    • ItemId PK - 主键
    • UPC,
    • EAN
  • TDItems

    • TdItemsId PK - 主键
    • UPC,
    • EAN

这两个表在我的数据库中通过FK约束无关。

这些表包含根据我想加入/联合它们共享相同信息的项目:UPC和EAN列

我尝试过这样的简单查询:

select * 
from Items as It join TDItems as tdi
on it.UPC=tdi.UPC and it.EAN=tdi.EAN

此查询返回"某些"结果,但是当我做了两个这样的查询的联合时:

  select * 
    from Items as It join TDItems as tdi
    on it.UPC=tdi.UPC 

    UNION -- important part I guess?

    select * 
    from Items as It join TDItems as tdi
    on it.EAN=tdi.EAN 

第一个查询返回504个结果,第二个查询返回709个结果...

所以我的问题是:

  1. 为什么第一个查询在结果相同时返回的结果会减少?
  2. 我如何进行此查询以便返回它找到的行数(即504,600或它可能是什么数字?)
  3. 有人可以帮助我为这些问题撰写正确的查询吗?

    编辑:

    嘿@Gordon我重写了内连接

    select * 
    from Items as It join TDItems as tdi
    on it.UPC=tdi.UPC OR it.EAN=tdi.EAN
    

    这是解决方案,让项目在UPC或EAN上匹配(即不必是匹配的UPC和EAN对)

2 个答案:

答案 0 :(得分:2)

UNION更像是OR

查询更像是UNION

select * 
from Items as It 
join TDItems as tdi
  on it.UPC = tdi.UPC 
  or it.EAN = tdi.EAN

答案 1 :(得分:1)

这是对问题的原始版本的回答。

我认为查询没有理由返回相同数量的行。这只取决于数据。例如,如果两个表之间没有UPC / EAN对,则第一个查询可以不返回任何行,但这两个表确实有共同UPC和{{1} }值独立。

至于你的第二个问题,你似乎想要EAN而不是select count(*)