我有两个表,它们是:
---------ATRIB---------
ITEMID NAMEOFTHEATTRIBUTE VALUE
100001 Length 5
100001 Height 6
-------TECHDATA--------
ITEMID NAMEOFTHEATTRIBUTE VALUE
100001 Length
100001 Height
100001 Weight
场景:用户创建了一个ATRIB表,并希望用相应的值更新表TECHDATA,但是他只有length和height两个值,尽管他需要在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
但这给出了一个语法错误,也尝试了左连接,但仍然不能得到我想要的结果,也许你们有什么建议?
发布于 2014-09-08 15:22:09
看起来你有一个不明确的列名。当不同的表中存在同名的列时,就会出现列名不明确的情况。在本例中,位于Techdata
和Attrib
列之间。
此查询假设您不介意重复项。
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)
发布于 2014-09-09 12:04:02
您似乎正在尝试从所提供的内容到仍然需要的内容进行限定。这可以通过执行左连接并获取仍然丢失的记录来通知用户来解决。从给定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 ...在WHERE中为NULL,它将只返回那些没有提供要填充的值的技术数据记录。然后,您可以根据返回的NameOfTheAttribute向用户显示。如果没有返回任何记录,则所有部分都已填写完毕,您可以继续执行实际的SQL-Update过程。
如果用户创建的属性表可以有多个itemID,那么我会稍微修改一下查询以适应。
https://stackoverflow.com/questions/25727559
复制