我需要一个可以从多个表中获取记录的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
任何人都可以帮我解决这个问题吗?
答案 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(*) >= 2
或count(distinct t2.RID) = 2
等变体。
顺便说一句,其他一些答案是使用左连接,然后在where
子句中对内部表进行过滤。一般情况下这是不正确的,但在您的情况下,它不会改变您的结果,因为外部联接首先是不相关的。无论您选择哪种解决方案,都不要在此处使用外部联接。
答案 1 :(得分:0)
您的第一个查询将始终返回0结果,因为t2.PID
不能与222
和333
相等。
如果我正确理解您的问题,您希望在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')