SELECT DName
FROM drugs
WHERE DID IN
(
SELECT DID,SID
FROM transactions
GROUP BY TotalCost
HAVING SID = 1 AND TotalCost > 100
)
在括号内执行此类查询将为我提供一个包含2列的结果,我需要从其中一列中选择结果。为了在HAVING
子句中使用SID,我需要将其包含在括号内的SELECT
运算符中,这就是为什么我得到2列的结果。
答案 0 :(得分:0)
您在IN语句中不能有2列。 您只需从选择中删除SID,只在HAVING中使用它。您实际上并不需要检索数据,并且您的IN子句将起作用。
答案 1 :(得分:0)
如果我理解正确,那么你想要这样的东西:
SELECT DName
FROM drugs
WHERE (DID, SID) IN
(
//Subquery
)
答案 2 :(得分:0)
答案已更新。对不起我已经删除了我以前的答案。感谢ZoharPeled提醒我之前的回答是错误的。
如果我理解你的问题,这应该适合你:
SELECT DName
FROM drugs
WHERE DID IN (
SELECT DID FROM(
SELECT DID,SID,TotalCost
FROM transactions
GROUP BY TotalCost
HAVING SID = 1 AND TotalCost > 100
) AS T
)
答案 3 :(得分:0)
您可以通过以下方式使用EXISTS
:
SELECT DName
FROM drugs
WHERE EXISTS
(
SELECT *
FROM transactions
WHERE SID = 1
AND TotalCost > 100
AND (
drugs.DID = transactions.SID
OR drugs.DID = transactions.DID
)
)
答案 4 :(得分:0)
你有几个答案 - 但我会在戒指中添加一个替代选项:
select DName
from drugs d
inner join (
SELECT DID
FROM transactions
WHERE SID = 1
AND TotalCost > 100
) tx on d.Did =tx.Did
我认为(如果你使用像......那么我可以在这里修正)
select *
from table
where EXISTS in ( // some subquery )
... EXISTS
子句中的子查询必须为 table
中的每个行运行。使用内部联接方法,RDBMS将为内联表执行一次sql,然后将结果保存在内存中以连接回另一个表。对于小桌子来说这很好 - 但是对于较大的桌子,可能会有很大的性能损失。