我有一张things
个表ItemID
列出的name
项。给定ItemID,我需要使用ItemID和具有相同ItemID = 1 name = poptarts
ItemID = 7 name = poptarts
ItemID = 8 name = cheddar
ItemID = 323 name = poptarts
select a.ItemID, a.name from things where a.ItemID = '1'
UNION
select b.ItemID, b.name from things where b.name = a.name
的所有其他项来获取记录。
在下面的示例数据中,如果ItemID为1,我需要选择具有相同名称的所有记录(在本例中为“poptarts”)作为ItemID 1,包括具有ItemID 1的记录。
{{1}}
我上面写的SQL并没有将a.name传递给第二个选择。有没有办法将第一个名称值传递给第二个选择?我希望语句返回itemid = 1作为第一行,7和323作为其他行。
答案 0 :(得分:3)
UNION
仅用于连接两个不同的集合。根据您的示例,您可能会执行以下操作:
SELECT a.ItemID, a.Name
FROM things a
WHERE name IN (SELECT name FROM things WHERE itemID = 1)
有很多方法可以编写这种查询,并且取决于您使用的SQL风格,但这应该或多或少具有普遍性。
答案 1 :(得分:1)
select
a.itemID,
a.name
from
things a
where a.name in (
select name
from things b
where b.itemID = '1'
)
答案 2 :(得分:1)
SELECT this.name, this.id, that.id
FROM thing this
LEFT JOIN thing that ON that.name=this.name AND that.id <> this.id
WHERE this.id = 1
;
注意:这也选择了没有双记录的这一行;在这种情况下,that.id将为NULL。如果要禁止没有双记录的记录,请删除LEFT
。
更新:添加了ID&lt;&gt; id子句用于抑制明显匹配。
答案 3 :(得分:0)
如果你真的只有一张桌子,不需要两次,UNION
或任何像htat这样的花哨。
SELECT
name
FROM
a --assuming this is your only table
GROUP BY
itemID, name
HAVING
itemID = '1'