内部连接第一个表中的3个字段与第二个表中的相同字段

时间:2019-06-09 18:08:08

标签: sql sql-server

我有table1(mtrlines),其中3个不同的列包含table1(prsn)中的ID。我需要从table2中选择name2而不是ID

仅对1列运行查询,它将起作用并返回正确的信息: 即

SELECT ['Ins.'].NAME2 AS ['Ins.']
FROM MTRLINES
INNER JOIN PRSN AS ['Ins.'] ON MTRLINES.CCCTABLE01 = ['Ins.'].PRSN
WHERE MTRLINES.FINDOC = 22648

我得到正确的结果:
第1行:FL
第2行:FL
第3行:GP

但是当尝试合并更多列时,它返回空值 即

SELECT ['Ins.'].NAME2 AS ['Ins.'], ['Ins.1'].NAME2 AS ['Ins.1']
FROM MTRLINES
INNER JOIN PRSN AS ['Ins.'] ON MTRLINES.CCCTABLE01 = ['Ins.'].PRSN
INNER JOIN PRSN AS ['Ins.1'] ON MTRLINES.CCCTABLE02 = ['Ins.1'].PRSN
WHERE MTRLINES.FINDOC = 22648

返回空值。

如何获取以下信息?

头:ins。| Ins.1
第1行:FL | EA
第2行:FL | RT
第3行:GP | EA

其中FL,EA等是prsn表的name2列中的值。

1 个答案:

答案 0 :(得分:0)

关于数据库和要求,您无需多说。但是给定查询和结果,您似乎没有MTRLINES.FINDOC = 22648和PRSN表中的两个匹配行的任何组合。

如果将联接更改为LEFT OUTER联接,则会看到是否有任何匹配项。像这样:

SELECT ['Ins.'].NAME2 AS ['Ins.'], ['Ins.1'].NAME2 AS ['Ins.1']
FROM MTRLINES
LEFT OUTER JOIN PRSN AS ['Ins.'] ON MTRLINES.CCCTABLE01 = ['Ins.'].PRSN
LEFT OUTER JOIN PRSN AS ['Ins.1'] ON MTRLINES.CCCTABLE02 = ['Ins.1'].PRSN
WHERE MTRLINES.FINDOC = 22648

要使结果更具可读性,至少在开发时,还要将MTRLINES表中的一列也添加到SELECT列表中。 如果只需要PRSN表中至少有 个对应行的行,则可以在WHERE子句中添加谓词:

AND EXISTS(SELECT ['INS.'].Name2, ['INS.1'].Name2 EXCEPT SELECT NULL,NULL)