0

我有一张我用代码选择的表:代码 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

以及我用代码选择的另一个表:代码 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

我已经在工作代码中加入了表格,这给了我在表 A 中但不在表 B 中的所有内容。

我现在正在尝试右连接表,这将为我提供表 B 中不在表 A 中的所有内容。现在输出什么都没有。


Right Join的完整代码:

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

如果有帮助,我可以为我的左连接添加我的工作代码。我还尝试切换选择区域,执行左连接,并更改 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
4

3 回答 3

3

---你有两个问题

  1. 由于您希望 B 中的所有记录不在 A 中。您需要显示 B 表列
  2. 您的加入条件不会量化唯一记录。28 和 9 被删除,因为 TDS-2258-01+OP10+S4 和 TDS-2325PU+OP10+S1 确实存在于表 A 中。问题是 TDS-2258-01+OP10+S4 TL-000032 不存在于A TDS-2325PU+OP10+S1 TL-000009 也没有。您用于加入的条件不正确。要知道正确的值,您需要指定表之间的关系或简单地(基于显示的数据)使用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。这让你得到....你所追求的两条记录..这只有在所有列都匹配时才有效。外部连接或存在/不存在提供了更大的灵活性。

连接上的视觉辅助以帮助更好地理解

于 2015-07-02T14:03:53.137 回答
2

根据您在评论中描述的内容,您正在寻找不存在而不是正确的加入。右连接将为您提供表 B 中的所有内容以及表 A 中匹配的所有内容。

Not exists 将在表 B 中找到不在表 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)
于 2015-07-02T14:18:01.413 回答
0

问题似乎很简单。你告诉我们:它会给我所有在表 B 中但不在表 A 中的东西

但是在预期的结果中,您告诉我们 TDS-2258-01+OP10+S4 必须在输出中,而这一行在表 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
于 2015-07-02T14:02:53.870 回答