SQL - 从第一个select语句传递变量到第二个select语句

4

我有一张名为things的表,其中列出了所有以ItemID列形式列出的项目。给定一个ItemID,我需要获取具有该ItemID和所有具有相同name的记录。

在下面的示例数据中,如果给定ItemID为1,则我需要选择所有与ItemID 1具有相同名称(在本例中为“poptarts”)的记录,包括ItemID 1的记录。

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

然而,我上面写的SQL没有将a.name传递给第二个select。有没有办法将第一个name值传递给第二个select?我希望语句返回itemid = 1作为第一行,然后是7和323。


你需要在哪里尝试这个? - luchosrock
4个回答

3

UNION 主要用于连接两个不同的集合。根据您的示例,您可能可以像这样进行操作:

SELECT a.ItemID, a.Name
FROM things a
WHERE name IN (SELECT name FROM things WHERE itemID = 1)

有很多方法可以编写这种类型的查询,这将取决于您使用的SQL语言版本,但这应该是更加通用的。


这将返回每一行。ItemID 1,ItemID 2,ItemID 3,所有项目都有不同的名称。 - BearSkyview
如果您删除子查询,只是将 name 值放入其中,即 SELECT a.itemID, A.name FROM Things a WHERE Name = 'poptarts',会发生什么? - Code Magician
这返回了我想要的,只是不是通过传入的项目ID。 - BearSkyview
如果你只运行子查询,你会得到“poptarts”。如果是这样,请仔细检查复制/粘贴,并考虑用“=”替换“IN”,如果itemID在你的表中是唯一的(尽管这不应该有任何影响)。 - Code Magician
如果我运行子查询,我只会得到ItemID = 1的行。 - BearSkyview
显示剩余2条评论

1
select 
  a.itemID,
  a.name
from
  things a
where a.name in (
  select name
  from things b
  where b.itemID = '1'
)

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
   ;

注意:这也会选择没有配对记录的this-rows;在这种情况下,that.id将为NULL。如果您想要禁止没有twin-records的记录,请删除LEFT

更新:添加id<> id子句以抑制明显匹配。


0
如果您只有一张表,就不需要重复引入它,也不需要使用 UNION 或其他花哨的方法。
SELECT 
    name
FROM
    a --assuming this is your only table
GROUP BY 
    itemID, name
HAVING
    itemID = '1'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接