SQL访问连接(内部和左侧可能?)

时间:2014-09-08 15:16:05

标签: sql ms-access

我有两张桌子,他们是:

---------ATRIB---------
ITEMID NAMEOFTHEATTRIBUTE VALUE
100001 Length              5
100001 Height              6

-------TECHDATA--------
ITEMID NAMEOFTHEATTRIBUTE VALUE
100001 Length              
100001 Height
100001 Weight

情况: 用户创建一个表ATRIB并希望用相应的值更新表TECHDATA,但是他只有长度和高度的值,尽管他需要输入TECHDATA表中的所有值。

我想检查TECHdata中存在的所有值是否都存在于ATRIB表中。我试过这个:

select ITEMID,NAMEOFTHEATTRIBUTE,VALUE
from       atrib    a
inner join TECHDATA b on a.itemid = b.itemid
left  join TECHDATA c on a.NAMEOFTHEATTRIBUTE = c.NAMEOFTHEATTRIBUTE

但是这会产生语法错误,也尝试了左连接,但仍然无法得到我想要的结果,也许你们有什么建议吗?

2 个答案:

答案 0 :(得分:0)

看起来你有一个模糊的列名。当不同表中存在具有相同名称的列时,会发生不明确的列名称。在这种情况下,在TechdataAttrib列之间。

此查询假设您不介意重复项。

SELECT a.ITEMID,a.NAMEOFTHEATTRIBUTE,a.VALUE
FROM ((atrib AS a
INNER JOIN TECHDATA AS b on a.itemid = b.itemid)
LEFT JOIN TECHDATA AS c on a.NAMEOFTHEATTRIBUTE = c.NAMEOFTHEATTRIBUTE)

答案 1 :(得分:0)

您似乎正在尝试从WAS提供的内容中获得符合条件的资格。这可以通过执行LEFT-JOIN并获取仍然缺失的记录来解决,以通知用户。从给定ItemID的所有数据开始,然后与ATRIB

进行比较
select
      td.NameOfTheAttribute
   from
      techdata td
         LEFT JOIN Atrib a
            on td.itemID = a.itemID
   where
          td.itemID = 1000001
      AND a.itemid IS NULL

您知道此人正在尝试查找的ID,因此请将该ID专门放在where子句中。然后,通过将AND ... IS NULL包含到WHERE中,它将仅返回那些没有为填充提供的值的技术数据记录。然后,您可以根据返回的NameOfTheAttribute显示用户。如果没有返回任何记录,那么所有部分都已填入,您可以继续实际的SQL-Update过程。

如果用户创建的属性表可以有多个itemID,那么我会略微修改查询以适应。