SQL - Right Join 没有输出
SQL - no output from Right Join
我有一个 table,我 select 代码:代码 A
Select TDS, TL, IK
From (Select Sheet1.TOOLING_DATA_SHEET As TDS, Sheet1.CUTTING_TOOL As TL, ENT_ITEM_MASTER.ITEM_KEY As IK
From Sheet1
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As A
输出:
TDS TL IK
TDS-1980D-10+OP10+S7 TL-000032 1
TDS-1980D-10+OP10+S7 TL-000019 34
TDS-2258-01+OP10+S4 TL-000016 53
TDS-2325PU+OP10+S1 TL-000036 7
TDS-1234-56-78 TL-000123 45
和另一个 table,我 select 使用代码:代码 B
Select ENT_LINK_OBJECTS.OBJ_NAME, ENT_ITEM_MASTER.ITEM_CODE, ENT_ITEM_MASTER.ITEM_KEY
From ENT_LINK_OBJECTS
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As B
输出:
OBJ_NAME ITEM_CODE ITEM_KEY
TDS-1980D-10+OP10+S7 TL-000032 1
TDS-1980D-10+OP10+S7 TL-000019 34
TDS-2258-01+OP10+S4 TL-000032 28
TDS-2258-01+OP10+S4 TL-000016 53
TDS-2325PU+OP10+S1 TL-000036 7
TDS-2325PU+OP10+S1 TL-000009 9
我已加入工作代码中的 tables,它为我提供了 Table A 中不在 Table B 中的所有内容。
我现在正在尝试右连接 tables,这会给我 Table B 中不在 Table A 中的所有内容。现在输出什么都没有.
右连接的完整代码:
Select TDS, TL, IK
From (Select Sheet1.TOOLING_DATA_SHEET, Sheet1.CUTTING_TOOL, ENT_ITEM_MASTER.ITEM_KEY
From Sheet1
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As A
Right Join (Select ENT_LINK_OBJECTS.OBJ_NAME As TDS, ENT_ITEM_MASTER.ITEM_CODE As TL, ENT_ITEM_MASTER.ITEM_KEY As IK
From ENT_LINK_OBJECTS
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As B
On A.TOOLING_DATA_SHEET=B.TDS
Where A.TOOLING_DATA_SHEET is Null
当前输出:
TDS TL IK
期望的输出:(B 中不在 A 中的所有内容)
TDS TL IK
TDS-2258-01+OP10+S4 TL-000032 28
TDS-2325PU+OP10+S1 TL-000009 9
如果有帮助,我可以为我的 Left Join 添加我的工作代码。我还尝试切换 Select 区域,执行左连接,并更改 Null 语句以尝试左连接,这也没有提供任何输出。
编辑:
我的代码如何使用左连接:
Select TDS, TL, IK
From (Select Sheet1.TOOLING_DATA_SHEET As TDS, Sheet1.CUTTING_TOOL As TL, ENT_ITEM_MASTER.ITEM_KEY As IK
From Sheet1
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As A
Left Join (Select ENT_LINK_OBJECTS.OBJ_NAME, ENT_ITEM_MASTER.ITEM_CODE, ENT_ITEM_MASTER.ITEM_KEY
From ENT_LINK_OBJECTS
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As B
On A.TDS=B.OBJ_NAME
Where B.OBJ_NAME is Null
输出:(A 中不在 B 中的所有内容)
TDS TL IK
TDS-1234-56-78 TL-000123 45
问题看起来很简单。你告诉 us:IT 会给我 Table B 中不在 Table A
中的一切
但是在预期的结果中,你告诉我们TDS-2258-01+OP10+S4必须在输出中,而这一行在Table A上,所以它不会在输出中.
我认为您想通过字段 ITEM_KEY 和 IK 进行连接,而不是使用 A.TDS=B.OBJ_NAME
同样在输出中你应该显示 OBJ_NAME, ITEM_CODE 和 ITEM_KEY 而不是 TDS,TL,IK
这是最终查询:
Select OBJ_NAME, ITEM_CODE, ITEM_KEY
From (Select Sheet1.TOOLING_DATA_SHEET As TDS, Sheet1.CUTTING_TOOL As TL, ENT_ITEM_MASTER.ITEM_KEY As IK
From Sheet1
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As A
Right Join (Select ENT_LINK_OBJECTS.OBJ_NAME, ENT_ITEM_MASTER.ITEM_CODE, ENT_ITEM_MASTER.ITEM_KEY
From ENT_LINK_OBJECTS
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As B
On A.IK=B.ITEM_KEY
Where A.TDS is Null
---你有两个问题
- 因为你想要所有来自 B 而不是 A 的记录。你需要显示 B table 列
- 您的加入条件未量化唯一记录。 28 和 9 被删除,因为 TDS-2258-01+OP10+S4 和 TDS-2325PU+OP10+S1 确实存在于 table A 中。问题是 TDS-2258-01+OP10+S4 TL-000032 不存在A 中不存在,TDS-2325PU+OP10+S1 TL-000009 也不存在。您用于加入的条件不正确。要知道正确的值 you 需要指定 table 之间的关系或简单地(基于显示的数据)使用
On A.TDS=B.OBJ_NAME
and A.TL = B.Item_Code
and A.IK = B.Item_key
意味着最终结果将是:
Select B.TDS, B.TL, B.IK
From (Select Sheet1.TOOLING_DATA_SHEET, Sheet1.CUTTING_TOOL, ENT_ITEM_MASTER.ITEM_KEY
From Sheet1
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As A
Right Join (Select ENT_LINK_OBJECTS.OBJ_NAME As TDS, ENT_ITEM_MASTER.ITEM_CODE As TL, ENT_ITEM_MASTER.ITEM_KEY As IK
From ENT_LINK_OBJECTS
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As B
On A.TDS=B.OBJ_NAME
and A.TL = B.Item_Code
and A.IK = B.Item_ke
Where A.TOOLING_DATA_SHEET is Null
如果您的 RDBMS 支持 MINUS(SQL SERVER 除外),这也可以工作
(SELECT ENT_LINK_OBJECTS.OBJ_NAME As TDS,
ENT_ITEM_MASTER.ITEM_CODE As TL,
ENT_ITEM_MASTER.ITEM_KEY As IK
FROM ENT_LINK_OBJECTS
INNER JOIN ENT_ITEM_MASTER
ON ENT_ITEM_MASTER.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY
AND ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As B
EXCEPT
(SELECT Sheet1.TOOLING_DATA_SHEET,
Sheet1.CUTTING_TOOL,
ENT_ITEM_MASTER.ITEM_KEY
FROM Sheet1
INNER JOIN ENT_ITEM_MASTER
ON ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL
AND ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) A
它基本上是说获取结果集 B 并从中减去结果集 A。这样您就可以得到...您要查找的两条记录.. 这仅在所有列都匹配时才有效。外部联接或 exists/not 存在提供更大的灵活性。
Visual Aid 关于加入以帮助更好地理解
根据您在评论中描述的内容,您正在寻找不存在而不是右连接。
右联接将为您提供 table B 中的所有内容以及 table A 中匹配的所有内容。
Not exists 将找到 Table B 中不在 Table A 中的所有内容。您需要如下内容:
Select ENT_LINK_OBJECTS.OBJ_NAME, e1.ITEM_CODE, e1.ITEM_KEY
From ENT_LINK_OBJECTS
Inner Join ENT_ITEM_MASTER e1
On e1.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY And e1.USER_LAST_MODIFIED Is Not Null
Where not exists
(Select *
From Sheet1
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null
where ENT_ITEM_MASTER.ITEM_KEY = e1.ITEM_KEY)
我有一个 table,我 select 代码:代码 A
Select TDS, TL, IK
From (Select Sheet1.TOOLING_DATA_SHEET As TDS, Sheet1.CUTTING_TOOL As TL, ENT_ITEM_MASTER.ITEM_KEY As IK
From Sheet1
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As A
输出:
TDS TL IK
TDS-1980D-10+OP10+S7 TL-000032 1
TDS-1980D-10+OP10+S7 TL-000019 34
TDS-2258-01+OP10+S4 TL-000016 53
TDS-2325PU+OP10+S1 TL-000036 7
TDS-1234-56-78 TL-000123 45
和另一个 table,我 select 使用代码:代码 B
Select ENT_LINK_OBJECTS.OBJ_NAME, ENT_ITEM_MASTER.ITEM_CODE, ENT_ITEM_MASTER.ITEM_KEY
From ENT_LINK_OBJECTS
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As B
输出:
OBJ_NAME ITEM_CODE ITEM_KEY
TDS-1980D-10+OP10+S7 TL-000032 1
TDS-1980D-10+OP10+S7 TL-000019 34
TDS-2258-01+OP10+S4 TL-000032 28
TDS-2258-01+OP10+S4 TL-000016 53
TDS-2325PU+OP10+S1 TL-000036 7
TDS-2325PU+OP10+S1 TL-000009 9
我已加入工作代码中的 tables,它为我提供了 Table A 中不在 Table B 中的所有内容。
我现在正在尝试右连接 tables,这会给我 Table B 中不在 Table A 中的所有内容。现在输出什么都没有.
右连接的完整代码:
Select TDS, TL, IK
From (Select Sheet1.TOOLING_DATA_SHEET, Sheet1.CUTTING_TOOL, ENT_ITEM_MASTER.ITEM_KEY
From Sheet1
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As A
Right Join (Select ENT_LINK_OBJECTS.OBJ_NAME As TDS, ENT_ITEM_MASTER.ITEM_CODE As TL, ENT_ITEM_MASTER.ITEM_KEY As IK
From ENT_LINK_OBJECTS
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As B
On A.TOOLING_DATA_SHEET=B.TDS
Where A.TOOLING_DATA_SHEET is Null
当前输出:
TDS TL IK
期望的输出:(B 中不在 A 中的所有内容)
TDS TL IK
TDS-2258-01+OP10+S4 TL-000032 28
TDS-2325PU+OP10+S1 TL-000009 9
如果有帮助,我可以为我的 Left Join 添加我的工作代码。我还尝试切换 Select 区域,执行左连接,并更改 Null 语句以尝试左连接,这也没有提供任何输出。
编辑:
我的代码如何使用左连接:
Select TDS, TL, IK
From (Select Sheet1.TOOLING_DATA_SHEET As TDS, Sheet1.CUTTING_TOOL As TL, ENT_ITEM_MASTER.ITEM_KEY As IK
From Sheet1
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As A
Left Join (Select ENT_LINK_OBJECTS.OBJ_NAME, ENT_ITEM_MASTER.ITEM_CODE, ENT_ITEM_MASTER.ITEM_KEY
From ENT_LINK_OBJECTS
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As B
On A.TDS=B.OBJ_NAME
Where B.OBJ_NAME is Null
输出:(A 中不在 B 中的所有内容)
TDS TL IK
TDS-1234-56-78 TL-000123 45
问题看起来很简单。你告诉 us:IT 会给我 Table B 中不在 Table A
中的一切但是在预期的结果中,你告诉我们TDS-2258-01+OP10+S4必须在输出中,而这一行在Table A上,所以它不会在输出中.
我认为您想通过字段 ITEM_KEY 和 IK 进行连接,而不是使用 A.TDS=B.OBJ_NAME
同样在输出中你应该显示 OBJ_NAME, ITEM_CODE 和 ITEM_KEY 而不是 TDS,TL,IK
这是最终查询:
Select OBJ_NAME, ITEM_CODE, ITEM_KEY
From (Select Sheet1.TOOLING_DATA_SHEET As TDS, Sheet1.CUTTING_TOOL As TL, ENT_ITEM_MASTER.ITEM_KEY As IK
From Sheet1
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As A
Right Join (Select ENT_LINK_OBJECTS.OBJ_NAME, ENT_ITEM_MASTER.ITEM_CODE, ENT_ITEM_MASTER.ITEM_KEY
From ENT_LINK_OBJECTS
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As B
On A.IK=B.ITEM_KEY
Where A.TDS is Null
---你有两个问题
- 因为你想要所有来自 B 而不是 A 的记录。你需要显示 B table 列
- 您的加入条件未量化唯一记录。 28 和 9 被删除,因为 TDS-2258-01+OP10+S4 和 TDS-2325PU+OP10+S1 确实存在于 table A 中。问题是 TDS-2258-01+OP10+S4 TL-000032 不存在A 中不存在,TDS-2325PU+OP10+S1 TL-000009 也不存在。您用于加入的条件不正确。要知道正确的值 you 需要指定 table 之间的关系或简单地(基于显示的数据)使用
On A.TDS=B.OBJ_NAME and A.TL = B.Item_Code and A.IK = B.Item_key
意味着最终结果将是:
Select B.TDS, B.TL, B.IK
From (Select Sheet1.TOOLING_DATA_SHEET, Sheet1.CUTTING_TOOL, ENT_ITEM_MASTER.ITEM_KEY
From Sheet1
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As A
Right Join (Select ENT_LINK_OBJECTS.OBJ_NAME As TDS, ENT_ITEM_MASTER.ITEM_CODE As TL, ENT_ITEM_MASTER.ITEM_KEY As IK
From ENT_LINK_OBJECTS
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As B
On A.TDS=B.OBJ_NAME
and A.TL = B.Item_Code
and A.IK = B.Item_ke
Where A.TOOLING_DATA_SHEET is Null
如果您的 RDBMS 支持 MINUS(SQL SERVER 除外),这也可以工作
(SELECT ENT_LINK_OBJECTS.OBJ_NAME As TDS,
ENT_ITEM_MASTER.ITEM_CODE As TL,
ENT_ITEM_MASTER.ITEM_KEY As IK
FROM ENT_LINK_OBJECTS
INNER JOIN ENT_ITEM_MASTER
ON ENT_ITEM_MASTER.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY
AND ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) As B
EXCEPT
(SELECT Sheet1.TOOLING_DATA_SHEET,
Sheet1.CUTTING_TOOL,
ENT_ITEM_MASTER.ITEM_KEY
FROM Sheet1
INNER JOIN ENT_ITEM_MASTER
ON ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL
AND ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null) A
它基本上是说获取结果集 B 并从中减去结果集 A。这样您就可以得到...您要查找的两条记录.. 这仅在所有列都匹配时才有效。外部联接或 exists/not 存在提供更大的灵活性。
Visual Aid 关于加入以帮助更好地理解
根据您在评论中描述的内容,您正在寻找不存在而不是右连接。 右联接将为您提供 table B 中的所有内容以及 table A 中匹配的所有内容。
Not exists 将找到 Table B 中不在 Table A 中的所有内容。您需要如下内容:
Select ENT_LINK_OBJECTS.OBJ_NAME, e1.ITEM_CODE, e1.ITEM_KEY
From ENT_LINK_OBJECTS
Inner Join ENT_ITEM_MASTER e1
On e1.ITEM_KEY=ENT_LINK_OBJECTS.ENTITY_KEY And e1.USER_LAST_MODIFIED Is Not Null
Where not exists
(Select *
From Sheet1
Inner Join ENT_ITEM_MASTER
On ENT_ITEM_MASTER.ITEM_CODE=Sheet1.CUTTING_TOOL And ENT_ITEM_MASTER.USER_LAST_MODIFIED Is Not Null
where ENT_ITEM_MASTER.ITEM_KEY = e1.ITEM_KEY)