Join 连接多列上的两个表,保持列之间的关系

Join 连接多列上的两个表,保持列之间的关系,join,multiple-columns,Join,Multiple Columns,表1 第[F、S、E]列 F1 S1 R F1 S2 R2 F1 S3 R1 F2 S1 R2 F2 S4 R4 F1 S4 R 表2 第[F,S]列 F1 S1 F1 S3 F2 S1 F2 S4 仅当Tab2中存在F->S关系时,才从TAB1中获取行 结果 第[F、S、E]列 F1 S1 R F1 S3 R F2 S4 R4 请注意,简单的内部连接在这里不起作用。。因为F和S之间有关系 使用内部联接将返回行F1 S4 R,但F1和S4之间没有关系 提前谢谢 内部联接左联接尝试 SELECT

表1
第[F、S、E]列

F1 S1 R

F1 S2 R2

F1 S3 R1

F2 S1 R2

F2 S4 R4

F1 S4 R

表2 第[F,S]列

F1 S1

F1 S3

F2 S1

F2 S4

仅当Tab2中存在F->S关系时,才从TAB1中获取行

结果 第[F、S、E]列

F1 S1 R

F1 S3 R

F2 S4 R4

请注意,简单的内部连接在这里不起作用。。因为F和S之间有关系

使用内部联接将返回行F1 S4 R,但F1和S4之间没有关系

提前谢谢

内部联接左联接

尝试

SELECT F, S, E 
FROM Tab1
WHERE EXISTS (SELECT * FROM Tab2 WHERE Tab1.F=Tab2.F AND Tab1.S=Tab2.S)
注意:如果您在Tab2中也有您想要的信息(您没有指定,但可能会指定),那么您也可以在这两列上加入

SELECT Tab1.F, Tab1.S, Tab1.E --, Tab2.XXX
FROM Tab1 INNER JOIN Tab2 on Tab1.F=Tab2.F AND Tab1.S=Tab2.S
为了验证此代码,下面是一个使用临时表的示例

SELECT * 
INTO #Tab1 
FROM (VALUES ('F1','S1','R'), ('F1','S2','R2')
    , ('F1','S3','R1'), ('F2','S1','R2')
    , ('F2','S4','R4'), ('F1','S4','R')) as T1(F, S, E)

SELECT * 
INTO #Tab2
FROM (VALUES ('F1','S1','Val1'), ('F1','S3','Val2')
    , ('F2','S1','Val3'), ('F1','S4','Val4')) as T2(F, S, XXX)
SELECT * FROM #Tab1
SELECT * FROM #Tab2

SELECT F, S, E 
FROM #Tab1 as T1
WHERE EXISTS (SELECT * FROM #Tab2 as T2 WHERE T1.F=T2.F AND T1.S=T2.S)

SELECT T1.F, T1.S, T1.E, T2.XXX
FROM #Tab1 as T1 INNER JOIN #Tab2 as T2 on T1.F=T2.F AND T1.S=T2.S

DROP TABLE #Tab1 
DROP TABLE #Tab2 
结果是相同的,除了第二个添加了虚拟列I添加到T2进行演示。结果如下。请注意,结果表列出了T1中所有且仅列出了T2中F&S值同时出现的行

F   S   E   XXX
F1  S1  R   Val1
F1  S3  R1  Val2
F2  S1  R2  Val3
F1  S4  R   Val4
如注释中所述,左(或右)外部联接可以使用相同的语法,但不能满足原始请求

左外部联接将包括来自T1的行,这些行在T2中没有对应的{F,S}行

右外部联接将包括(T1.F、T1.s和T1.E的值都为null)在T1中没有对应的{F,s}对的T2行


这两个查询都是非常有效的,它们提供了有用的信息,但不是最初提出的问题。

Thants great Robert Sheahan,感谢您对此进行研究。这也可以用左半联接执行。您提供的第二个查询没有返回正确的结果。很高兴我能提供帮助,因此为我节省了很多时间,我很高兴能够向前支付:-)我测试了输出,并且两个查询的结果都相同,您能详细说明它是如何出错的吗?请说明哪个输出行丢失或多余,我将在今天晚些时候查看。如果您需要向任一原始表中添加行来说明错误,请明确指出哪些是新的,以节省逐行比较的工作量。您的示例结果似乎与您的问题陈述不匹配,(F=F1,S=S3)关系在表1中的值为R1而不是R,而关系(F=F2,S=S1)出现在Tab1的第4行和Tab2的第3行,因此应该出现在您的输出中。请在代码问题中给出一个--cut&paste&runnable代码;示例输入(作为表格初始化代码),具有预期和实际输出(包括逐字错误消息);标签和版本;清晰的说明和解释。这包括您能给出的最少代码,即您显示为OK的代码,由您显示为not OK的代码扩展。(调试基础。)这还不清楚。你用什么语言编码?“->”和“因为”之间有关系,这意味着什么?你用“关系”来表示FK吗?关系模型中的关系(ship)是表。FKs错误地被称为关系(船舶)s。查询不需要约束(FKs、PKs等)&如果添加约束,则无法使正确的查询无效。使用足够的单词、句子和引用部分例子,清楚、完整地说出你的意思。当给出一个关系(ship)/关联或表(base或query result)时,请说明其中的一行根据其列值对业务状况的描述。