sql查询以获取多个值的记录

时间:2016-09-02 15:32:45

标签: sql-server inner-join

我需要一个可以从多个表中获取记录的SQL查询。请检查以下方案 -

有2个表 - 表1和表2

以下是查询。

表1:

PID   PName
1      A
2      B

表2 :(表1和表2中存在外键关系'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的存在,如-222和333

输出应该是这样的 -

   PName 
     A  

任何人都可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

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

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子句中对内部表进行过滤。一般情况下这是不正确的,但在您的情况下,它不会改变您的结果,因为外部联接首先是不相关的。无论您选择哪种解决方案,都不要在此处使用外部联接。

答案 1 :(得分:0)

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

如果我正确理解您的问题,您希望在PID 222 333中包含结果。 E.g。

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

答案 2 :(得分:0)

您需要使用LEFT JOIN:

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'

答案 3 :(得分:0)

你可以使用不同的

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