SQL - 如何正确实现 LEFT Join with Inner Joins
SQL - how to correctly implement LEFT Join with Inner Joins
我有两个信息表。一个存在于系统中,另一个正在导入以比较和更新信息。我正在尝试使用 Right Join 来获取 Table B 中不在 Table A 中的信息。我需要引入来自 Table B 的信息,因此输出值为不为空。
完整代码:
Select TDS, TL, IK
From (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) As A
RIGHT JOIN Sheet1 B
On A.TDS=B.TOOLING_DATA_SHEET
Where A.TDS is Null
示例:
Table一个
来自代码:
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
应该产生:
OBJ_NAME ITEM_CODE IK
tds-123 tl-1234 387
tds-456 tl-8721 879
tds-983 tl-1987 928
TableB
使用代码:
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
应该产生:
TOOLING_DATA_SHEET CUTTING_TOOL ITEM_KEY
tds-123 tl-1234 387
tds-456 tl-8721 879
tds-983 tl-1987 928
tds-873 tl-9873 827
tds-982 tl-9872 287
目前返回的代码:
TDS TL IK
NULL NULL NULL
NULL NULL NULL
代码应该返回什么:
TDS TL IK
tds-873 tl-9873 827
tds-982 tl-9872 287
在左联接处进行编辑尝试 - 无效,需要实施 Sheet1 的联接
Select l.OBJ_NAME As TDS, i.ITEM_CODE As TL, i.ITEM_KEY As IK
From ENT_LINK_OBJECTS l
Join ENT_ITEM_MASTER i On i.ITEM_KEY=l.ENTITY_KEY
Left Join Sheet1 s on l.OBJ_NAME = s.TOOLING_DATA_SHEET and
i.ITEM_CODE = s.CUTTING_TOOL and
i.ITEM_KEY = i.ITEM_KEY
where s.CUTTING_TOOL is null
您可以使用left join
/is null
:
select l.OBJ_NAME As TDS
, i.ITEM_CODE As TL
, i.ITEM_KEY As IK
from ENT_LINK_OBJECTS l
join ENT_ITEM_MASTER i on i.ITEM_KEY = l.ENTITY_KEY
left Join Sheet1 s on l.OBJ_NAME = s.TOOLING_DATA_SHEET and
i.ITEM_CODE = s.CUTTING_TOOL and
i.ITEM_KEY = s.ITEM_KEY
where s.CUTTING_TOOL is null
试试这个查询
select a.* from tableb a
right join tablea b on a.tooling_data_sheet=b.obj_name
where b.obj_name is null
您也可以考虑简单地使用 not exists
:
select lo.*
From ENT_LINK_OBJECTS lo
where not exists (select 1
from ENT_ITEM_MASTER im
where im.ITEM_KEY = lo.ENTITY_KEY
);
缩写lo
和im
被称为table别名。使用它们是个好主意。有时需要它们;更多时候,它们只是让查询更容易编写和阅读。使用 table 名称的缩写被认为是最佳做法。
解决方案:当使用 Left Join 和多个 Inner Join 语句时,您可以定义如下
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) 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) As B
On A.TDS=B.OBJ_NAME
Where B.OBJ_NAME is Null
我有两个信息表。一个存在于系统中,另一个正在导入以比较和更新信息。我正在尝试使用 Right Join 来获取 Table B 中不在 Table A 中的信息。我需要引入来自 Table B 的信息,因此输出值为不为空。
完整代码:
Select TDS, TL, IK
From (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) As A
RIGHT JOIN Sheet1 B
On A.TDS=B.TOOLING_DATA_SHEET
Where A.TDS is Null
示例:
Table一个
来自代码:
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
应该产生:
OBJ_NAME ITEM_CODE IK
tds-123 tl-1234 387
tds-456 tl-8721 879
tds-983 tl-1987 928
TableB 使用代码:
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
应该产生:
TOOLING_DATA_SHEET CUTTING_TOOL ITEM_KEY
tds-123 tl-1234 387
tds-456 tl-8721 879
tds-983 tl-1987 928
tds-873 tl-9873 827
tds-982 tl-9872 287
目前返回的代码:
TDS TL IK
NULL NULL NULL
NULL NULL NULL
代码应该返回什么:
TDS TL IK
tds-873 tl-9873 827
tds-982 tl-9872 287
在左联接处进行编辑尝试 - 无效,需要实施 Sheet1 的联接
Select l.OBJ_NAME As TDS, i.ITEM_CODE As TL, i.ITEM_KEY As IK
From ENT_LINK_OBJECTS l
Join ENT_ITEM_MASTER i On i.ITEM_KEY=l.ENTITY_KEY
Left Join Sheet1 s on l.OBJ_NAME = s.TOOLING_DATA_SHEET and
i.ITEM_CODE = s.CUTTING_TOOL and
i.ITEM_KEY = i.ITEM_KEY
where s.CUTTING_TOOL is null
您可以使用left join
/is null
:
select l.OBJ_NAME As TDS
, i.ITEM_CODE As TL
, i.ITEM_KEY As IK
from ENT_LINK_OBJECTS l
join ENT_ITEM_MASTER i on i.ITEM_KEY = l.ENTITY_KEY
left Join Sheet1 s on l.OBJ_NAME = s.TOOLING_DATA_SHEET and
i.ITEM_CODE = s.CUTTING_TOOL and
i.ITEM_KEY = s.ITEM_KEY
where s.CUTTING_TOOL is null
试试这个查询
select a.* from tableb a
right join tablea b on a.tooling_data_sheet=b.obj_name
where b.obj_name is null
您也可以考虑简单地使用 not exists
:
select lo.*
From ENT_LINK_OBJECTS lo
where not exists (select 1
from ENT_ITEM_MASTER im
where im.ITEM_KEY = lo.ENTITY_KEY
);
缩写lo
和im
被称为table别名。使用它们是个好主意。有时需要它们;更多时候,它们只是让查询更容易编写和阅读。使用 table 名称的缩写被认为是最佳做法。
解决方案:当使用 Left Join 和多个 Inner Join 语句时,您可以定义如下
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) 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) As B
On A.TDS=B.OBJ_NAME
Where B.OBJ_NAME is Null