SQL - 将变量从第一个选择传递到第二个选择

时间:2012-12-19 20:52:13

标签: sql select

我有一张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作为其他行。

4 个答案:

答案 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'