Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何查询sql server中具有多对多关系的两个表以识别差异_Sql_Sql Server_Join_M2m - Fatal编程技术网

如何查询sql server中具有多对多关系的两个表以识别差异

如何查询sql server中具有多对多关系的两个表以识别差异,sql,sql-server,join,m2m,Sql,Sql Server,Join,M2m,我有两个具有多对多关系的表,我正在尝试在select语句中合并这两个表。我想查看两个表中的所有记录,但只将表A中的1条记录与表b中的1条记录进行匹配,所以空值是可以的 例如,表A有20条记录,只与表B中的15条记录匹配。我想查看所有20条记录,无法匹配的5条记录可以显示null 表1 什么|代码 苹果75 披萨| 75 橙色| 6 球| 75 绿色| 4 红色| 6 表2 日期| id 1975年2月15日 2007年2月11日| 75 1月10日| 6日 2008年4月4日 我需要的结果是 某

我有两个具有多对多关系的表,我正在尝试在select语句中合并这两个表。我想查看两个表中的所有记录,但只将表A中的1条记录与表b中的1条记录进行匹配,所以空值是可以的

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

表1 什么|代码 苹果75 披萨| 75 橙色| 6 球| 75 绿色| 4 红色| 6

表2 日期| id 1975年2月15日 2007年2月11日| 75 1月10日| 6日 2008年4月4日

我需要的结果是 某物|日期|代码| ID

苹果公司| 2月15日| 75 | 75 比萨饼| 2月11日| 75 | 75 橙色| 1月10日| 6日| 6 球|零| 75 |零 绿色| 2008年4月4日| 4
红色| NULL | 6 | NULL

一个常规的左连接应该可以为您完成

select tableA.*
     , tableB.*
  from tableA
left join tableB
       on tableB.PrimaryKey = tableA.PrimaryKey
左外连接 问题变了 让它成为一个完整的外部连接

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

我在想象这样的事情。您希望并排排列两行,但其中一行将比其他行多

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*…中的默认列表。。。或者假设插入顺序是重要的。

您需要左连接,这是一个内部连接,不会给出OP想要的结果。谢谢,我尝试了左连接和右连接,但没有产生正确的结果。例如,如果表A有5条记录的ID 859,而表B只有2条记录的代码859,我需要加入这2个表,但确保ID 859仅与表B中的记录匹配2次。其余3条ID为859的记录的代码应为空,我已经尝试了左右连接,但没有产生正确的结果。例如,如果表A有5条记录的ID 859,而表B只有2条记录的代码859,我需要加入这2个表,但确保ID 859仅与表B中的记录匹配2次。其余3条ID为859的记录的代码应为空,我已经尝试了左右连接,但没有产生正确的结果。例如,如果表A有5条记录的ID 859,而表B只有2条记录的代码859,我需要加入这2个表,但确保ID 859仅与表B中的记录匹配2次。其余3条ID为859的记录应为空Code@Panthr073这是一大堆细节,而不是原来的问题。见更新。谢谢。对不起,我不认为我提供的例子是好的,但你们确实提到了我要做的是并排成对的行,但其中一行比其他行要多。我将尝试你提供的代码,看看我是否可以让它工作。谢谢我最初使用group by编写了一个查询,然后您发布了问题的数据更新。因此,我最终更改了它,并意外地将其保留在GROUPBY子句中,同时也没有更改分区bypart。修正了,但很抱歉。嘿@shawnt00,非常感谢!这正是我需要的!我是新到这个网站,所以我不知道如何给你信用。我只是投你的赞成票吗?我想当你还是新人的时候,你还不能投反对票。但是你现在可以把它标记为已被接受的答案,如果你愿意的话,稍后再回来投票。为什么苹果的日期是2月15日,pizze的日期是2月11日?两者都有相同的id和代码?