【问题标题】:SQL selecting IN given set desnt get narrowed down选择 IN 给定集合的 SQL 不会缩小范围
【发布时间】:2012-03-06 00:00:16
【问题描述】:

我有一个包含电子邮件的表格(称为邮件),我想将特定消息标记为分配给不同的工作团队(例如 team01、team02 等)。 msgteam 关​​系保存在另一个表中(称为 MailAssignments)。我正在尝试获取标记为仅针对一个团队的消息(例如 team01),并且消息 ID 应小于指定值,以便将消息集缩小到 10 条。

我有以下查询,但它总是显示分配给团队的所有消息,而不是只显示带有 msgId

我的查询有什么问题?

string queryGetMails =
"SELECT TOP 10 * FROM Mails WHERE msgId IN (SELECT msgId FROM MailAssignments WHERE (forTeam='team01') AND (msgId < ?) )";

我也试过这个(结果是一样的):/

"SELECT TOP 10 * FROM Mails WHERE (msgId<?) AND (msgId IN (SELECT msgId FROM MailAssignments WHERE forTeam='team01' ) )";

【问题讨论】:

  • 你的最终目标是实现分页吗?一次显示 10 条消息?
  • @Patrick,是的,完全正确。我想一次只显示 10 条消息,并且只显示那些分配给给定团队的消息。
  • 好的,一旦您的查询正常工作,请查看此 SO 帖子。它将让您了解如何对结果进行分页。 stackoverflow.com/questions/1900635/…

标签: c# sql ms-access


【解决方案1】:

当两个表之间似乎有明确的连接时,为什么还要坚持使用子查询和 in 子句?你试过吗?

SELECT TOP 10 Mails.* 
FROM Mails left join 
MailAssignments On Mails.msgID = MailAssignments.msgID 
WHERE Mails.msgId < ? AND MailAssignments.forTeam = 'team01'

【讨论】:

  • 给出索引超出范围异常:System.IndexOutOfRangeException: msgId 在 C# 代码中尝试获取指定列名的列 id 时:int idCol = myReader.GetOrdinal("msgId");
  • 你能用有问题的行显示调用这个查询的代码吗?然而,这似乎是另一个问题。如果您将查询放入访问并运行,您会得到预期的结果吗?
  • OutOfRangeException 可能是因为 msgID 不明确......它存在于 MailAssignments 和 Mails 中。如果您明确定义要在选择中返回的字段,您将确切地知道要查询您的阅读器的内容。
  • @Patrick,对,最好是明确的,或者只是邮件。*。答案已更新
  • @Steve,整个代码太长,无法在此处粘贴,因为它会检索所有电子邮件详细信息(发件人、收件人、主题、正文等),但通常只是: 1. 定义的 sql 查询。 2. 然后myConnection.Open();ExecuteReader(); 3. 然后得到列号myReader.GetOrdinal("msgId"); 4. 然后循环myReader.Read() 逐行读取所有数据。当检查第一列号时,我得到了异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多