【问题标题】:sql query to get record by multiple valuessql查询通过多个值获取记录
【发布时间】:2016-09-02 15:32:44
【问题描述】:

我需要一个可以从多个表中获取记录的 sql 查询。请检查以下场景 -

有 2 个表 - Table1 和 Table2

下面是查询。

表 1:

PID   PName
1      A
2      B

Table2 : (有一个外键关系 b/w Table1 和 Table2 by 'PID')

PPID   PID  RID
101     1   222
102     1   333
103     2   001
104     2   002

我希望查询可以从 Table1(我需要 PName)和 Table2 中获取记录-

SELECT t1.PName FROM Table1
INNER JOIN Table2 on t1.PID = t2.PID
where t2.PID = '222' and t2.PID = '333'

SELECT t1.PName FROM Table1
INNER JOIN Table2 on t1.PID = t2.PID
INNER JOIN dbo.StringSplit('222,333', ',') AS t on t2.PID = t.item

但在这两种情况下,我都没有得到正确的结果。

我想要 RID 的 PID 应该存在的记录 - 222 和 333

输出应该是这样的-

   PName 
     A  

谁能帮我解决这个问题?

【问题讨论】:

  • 请填写您的预期结果。
  • 您需要什么不清楚,请提供所需的结果集作为示例。
  • #chris,TJB ,我添加了我想要的输出。

标签: sql-server inner-join


【解决方案1】:

这是一个常见的问题。分组很容易:

select min(PName) as PName
from Table1 t1 inner join Table2 t2 on t2.PID = t1.PID
where t2.RID in ('222', '333')
group by t1.PID
having count(*) = 2

您的样本数据有限,不清楚特殊值“111”和“222”的意义。根据实际的关系,您可能真的需要像 count(*) >= 2count(distinct t2.RID) = 2 这样的变体。

顺便说一句,其他一些答案是使用左连接,然后在 where 子句中对内部表进行过滤。一般来说,这是不正确的,但在你的情况下,它不会改变你的结果,因为外部连接首先是不相关的。无论您选择哪种解决方案,都不要在此处使用外部联接。

【讨论】:

  • 当然,如果有 2 行 RID = '222' 或 '333' 这将返回误报。
  • @SeanLange 这就是我对count(distinct...)发表评论的原因
  • 啊,是的,错过了那条评论……很明显。 :D
【解决方案2】:

您的第一个查询将始终返回 0 个结果,因为 t2.PID 不能同时等于 222333

如果我正确理解您的问题,您希望包含 PID 为 222 OR 333 的结果。例如

SELECT t1.PName, t2.RID FROM Table1
INNER JOIN Table2 on t1.PID = t2.PID
where t2.PID = '222' OR t2.PID = '333'

【讨论】:

  • #Chris,我想要 PID 应该存在于 RID 之类的记录 - 222 和 333
【解决方案3】:

你需要使用左连接:

SELECT t1.PName, t2.RID FROM Table1 t1
LEFT JOIN table2 t2
ON t1.PID = t2.PID
WHERE t2.RID = '222' OR t2.RID = '333'

【讨论】:

    【解决方案4】:

    你可以使用 distinct

    SELECT DISTINCT PNAME FROM dbo.Table1
    INNER JOIN dbo.Table2 ON Table11.PID = TABle22.PID
    WHERE rid IN ('222','333')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-26
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多