使用多个值的Where子句的SQL语句

65

我有一个表,其中包含多行,每行都有以下字段:

PersonName SongName Status

我想使用从多选列表框中选择的名称,我可以检索该值,然后进行where子句,以显示所有选定人员都能演奏的歌曲名称,因此状态为完成。

例如:

 PersonName      SongName    Status 
 Holly           Highland    Complete
 Holly           Mech        Complete 
 Ryan            Highland    Complete
如果我从列表框中选择了Holly和Ryan,并按下按钮,那么查询应该只显示Highland,因为这是他们共同知道的。

如果 Ryan 的状态不是 Complete,那么结果应该是 Highland 吗? - Mosty Mostacho
SELECT [SongName] FROM [Learning] WHERE ([BandieName] LIKE '%' + '" & item.Text & "' + '%' ) AND ([BandieName] LIKE '%' + '" & item.Text & "' + '%' ) AND ([Status] LIKE 'Complete') - Sophie
3个回答

110

试试这个:

select songName from t
where personName in ('Ryan', 'Holly')
group by songName
having count(distinct personName) = 2

在 having 子句中的数字应该与人数相匹配。如果你还需要状态为 Complete,请使用以下的 where 子句:

where personName in ('Ryan', 'Holly') and status = 'Complete'

这并没有带来任何结果,这与我之前处理的类似,如果你使用了“holly”和“RYAN”,那么它不会带来任何结果,如果你使用OR而不是AND,它将会呈现出所有那些对于Holly和Ryan都有完成状态的歌曲,而不仅仅是那些Holly和Ryan都完成的歌曲。谢谢。 - Sophie
1
这是不可能的,因为您可以在此处看到它使用您提供的相同数据提供了预期的结果(http://sqlfiddle.com/#!2/e1783/2)。 - Mosty Mostacho
所以这个查询运行并提供了您预期的结果,因此它运行正确吗? - Sophie
1
抱歉,我误解了您的回复。不过那个方法非常有效。谢谢! - Sophie
不,逻辑是正确的,因此结果也是正确的:逻辑很清晰,首先删除所有与“Ryan”和“Holly”不同的值,然后按歌曲名称分组。如果不同计数的人名数量为两个(因为Ryan和Holly都是2),那么这意味着Ryan和Holly都有这首歌。进行您需要的所有测试,并让我知道您是否在获得的结果中检测到任何错误。 - Mosty Mostacho
我们如何在日期时间列上使用相同的IN子句? - Eswar

19
SELECT PersonName, songName, status
FROM table
WHERE name IN ('Holly', 'Ryan')
如果您正在使用参数化存储过程:
  1. 传入逗号分隔的字符串
  2. 使用特殊函数将逗号分隔的字符串拆分为表值变量
  3. 使用包含传入名称的表变量进行内部连接,例如 INNER JOIN ON t.PersonName = newTable.PersonName

名称应该是列PersonName的别名。 - aF.
@aF。你可能会感到困惑 - 样本数据显示的列名与先前提到的定义不同! - Bridge

2
Select t1.SongName
From tablename t1
left join tablename t2
 on t1.SongName = t2.SongName
    and t1.PersonName <> t2.PersonName
    and t1.Status = 'Complete' -- my assumption that this is necessary
    and t2.Status = 'Complete' -- my assumption that this is necessary
    and t1.PersonName IN ('Holly', 'Ryan')
    and t2.PersonName IN ('Holly', 'Ryan')

它们都在同一张表中吗? - Sophie
@Sophie 是的,这是一个自连接。 - Sam DeHaan
我的表名叫做Learning,那么t1和t2的等价名称是什么? - Sophie
2
@Sophie 它们是简单的别名,用于区分表的不同实例。它们可以是 t1 和 t2。它们可以是 cat 和 dog,learning1 和 learning2,l1 和 l2... - Sam DeHaan

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