【问题标题】:join two tables on multiple columns maintaing relation between the columns在多个列上连接两个表,维护列之间的关系
【发布时间】:2019-09-04 16:23:13
【问题描述】:

Tab1
列 [F,S,E]

F1 S1 R

F1 S2 R2

F1 S3 R1

F2 S1 R2

F2 S4 R4

F1 S4 R

Tab2 列[F,S]

F1 S1

F1 S3

F2 S1

F2 S4

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

结果 列[F,S,E]

F1 S1 R

F1 S3 R

F2 S4 R4

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

使用内连接会返回一行 F1 S4 R,但 F1 和 S4 之间没有关系。

提前致谢

内连接左连接

【问题讨论】:

  • 您的示例结果似乎与您的问题陈述不匹配, (F=F1, S=S3) 关系在您的 Tab1 中的值为 R1 而不是 R,并且关系 (F=F2 , S=S1) 出现在 Tab1 的第 4 行和 Tab2 的第 3 行,因此应该在您的输出中。
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码;具有所需和实际输出(包括逐字错误消息)的示例输入(作为表格初始化代码);标签和版本;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)
  • 这个不清楚。你用什么语言编码? “->”和“因为两者之间存在关系”是什么意思?您对 FK 使用“关系”吗?关系模型中的关系(ship)是表。 FK 错误地被称为关系(船舶)。查询不需要约束(FK、PK 等),如果添加约束,则不能使正确查询无效。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。在给出关系(船舶)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。

标签: join multiple-columns


【解决方案1】:

试试

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 

除了第二个添加了我添加到 T2 以进行演示的虚拟列之外,结果是相同的。结果如下。请注意,结果表仅列出了 T1 中 F 和 S 值在 T2 中同时出现的所有行。

F   S   E   XXX
F1  S1  R   Val1
F1  S3  R1  Val2
F2  S1  R2  Val3
F1  S4  R   Val4

正如 cmets 中所要求的,左(或右)外连接可以使用相同的语法,但不能满足原始请求。

左外连接将包含 T1 中的行,而 T2 中没有对应的 {F,S} 行

右外连接将包括(T1.F、T1.s 和 T1.E 的值全部为 NULL)在 T1 中没有对应 {F,S} 对的 T2 行。

两者都是完全有效的查询,提供有用的信息,但不是最初询问的内容。

【讨论】:

  • 感谢伟大的 Robert Sheahan,感谢您对此进行调查
  • 也可以用左半连接来执行。您提供的第二个查询没有返回正确的结果。
  • 很高兴我能帮上忙,所以为我节省了很多时间,我很乐意将其支付 :-) 我测试了输出,两个查询看起来都一样,你能详细说明一下吗错误?请说明缺少或多余的输出行,我将在今天晚些时候尝试查看。如果您需要在任何一个原始表格中添加行来说明错误,请清楚地指出哪些是新的,以节省我逐行比较的工作。
猜你喜欢
  • 2014-03-12
  • 1970-01-01
  • 2019-07-11
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 2016-06-01
  • 1970-01-01
相关资源
最近更新 更多