繁体   English   中英

如何在SQL Server中查询具有多对多关系的2个表以识别差异

[英]How to query 2 tables in sql server with many to many relationship to identify differences

我有两个具有多对多关系的表,并且我试图在select语句中合并这两个表。 我想查看两个表中的所有记录,但仅将表A中的1条记录匹配到表b中的1条记录,因此可以使用null值。

例如,表A有20条记录,仅与表B中的15条记录匹配。我想查看所有20条记录,其中5条无法匹配的记录可以显示为空。

表格1

东西| 码#

苹果| 75
披萨 75
橙色| 6
球| 75
绿色| 4
红色| 6

表2

日期| ID#

15年2月| 75
2011年2月| 75
2010年1月| 6
2008年4月| 4

我需要的结果是

东西| 日期| 代码#| ID#


苹果| 15年2月| 75 | 75
披萨 2011年2月| 75 | 75
橙色| 2010年1月| 6 | 6
球| NULL | 75 | 空值
绿色| 2008年4月| 4 | 4
红色| NULL | 6 | 空值

常规的左联接应为您完成。

select tableA.*
     , tableB.*
  from tableA
left join tableB
       on tableB.PrimaryKey = tableA.PrimaryKey

我在想像这样的事情。 您想并排排列成对的行,但一侧将比另一侧更多。

select * /* change to whatever you need */
from
    (
        select *, row_number() over (partition by "code#" order by "something") as rn
        from tableA
    ) as a
        full outer join /* sounds like maybe left outer join will work too */
    (
        select *, row_number() over (partition by "id#" order by "date" desc) as rn
        from tableB
    ) as b
        on b."id#" = a."code#" and b.rn = a.rn

实际上,我不知道在没有其他专栏文章的情况下,如何将“球”放在“苹果”和“比萨饼”之后。 SQL表中的行没有任何顺序,您不能依赖select *...的默认列表,也不能假设插入顺序很重要。

左外连接
问题已更改
做一个完整的外部连接

select table1.*, table2.* 
  from table1 
  full outer join table2  
    on table1.Code# = table2.id#

这可能不是真正的多对多,但我认为这是您要的

我们需要查看表结构来肯定地告诉您,但实际上您需要加入完整键(如果可能)

SELECT * FROM TABLEA A

JOIN TABLEB B ON
A.FULLKEY = B.FULLKEY

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM