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

---你有两个问题

  1. 因为你想要所有来自 B 而不是 A 的记录。你需要显示 B table 列
  2. 您的加入条件未量化唯一记录。 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)