Sql 从一列中选择值而不是选择值,然后合并结果
好的,标题很混乱,所以让我用一个例子来解释 我的桌子:Sql 从一列中选择值而不是选择值,然后合并结果,sql,Sql,好的,标题很混乱,所以让我用一个例子来解释 我的桌子: id ref valid --------------- 1 PRO true 1 OTH true 2 PRO true 2 OTH false 3 PRO true 4 OTH true 这里的主键是id和ref的组合 我想选择所有同时具有有效PRO ref和另一个有效ref的ID,这意味着在这种情况下,它将只返回1。 我不明白如何才能做到这一点,IN和SELF-JOIN似乎不适合这样做。这里有
id ref valid
---------------
1 PRO true
1 OTH true
2 PRO true
2 OTH false
3 PRO true
4 OTH true
这里的主键是id和ref的组合
我想选择所有同时具有有效PRO ref和另一个有效ref的ID,这意味着在这种情况下,它将只返回1。
我不明白如何才能做到这一点,IN和SELF-JOIN似乎不适合这样做。这里有一种方法,使用EXISTS:
这里有一种方法,使用EXISTS:
使用联接:
使用联接:
选择id
来自表1 a
内部联接选择id,计数*表1中按id分组的计数作为临时值
在温度id=a.id且计数>1时
其中a.ref='PRO'选择id
来自表1 a
内部联接选择id,计数*表1中按id分组的计数作为临时值
在温度id=a.id且计数>1时
其中a.ref='PRO'这是我的解决方案:
SELECT id
FROM val
WHERE valid='true'
GROUP BY id
HAVING
COUNT(DISTINCT ref)>1
AND COUNT(CASE WHEN ref='PRO' THEN ref END)>0
请看小提琴。这是我的解决方案:
SELECT id
FROM val
WHERE valid='true'
GROUP BY id
HAVING
COUNT(DISTINCT ref)>1
AND COUNT(CASE WHEN ref='PRO' THEN ref END)>0
请参阅fiddle。您可以使用内部自连接、嵌套查询和一些分组来解决此问题:
SELECT A.*
FROM (
SELECT id
FROM test
WHERE (ref = 'PRO') AND (valid = 'true')
) AS A
INNER JOIN (
SELECT id
FROM test
WHERE valid = 'true'
GROUP BY id
HAVING (
count( DISTINCT ref ) >1
)
) AS B
ON A.id = B.id
A子查询使用“PRO”ref查询表id,B分组并查询表中至少有两个ref为valid to true的id。您可以使用内部自连接、嵌套查询和一点分组来解决此问题:
SELECT A.*
FROM (
SELECT id
FROM test
WHERE (ref = 'PRO') AND (valid = 'true')
) AS A
INNER JOIN (
SELECT id
FROM test
WHERE valid = 'true'
GROUP BY id
HAVING (
count( DISTINCT ref ) >1
)
) AS B
ON A.id = B.id
A子查询使用“PRO”ref查询表id,B分组并查询表中至少有两个ref为valid至true的id。!但是为什么必须在id上加入?因为否则,如果存在任何id的有效行,而不仅仅是相关的id,EXISTS查询将返回true!但是为什么您必须在id上加入?因为否则,如果任何id都有有效行,EXISTS查询将返回true,而不仅仅是相关的id必须有效?或者它可能是假的?是的,PRO也必须是有效的问题editedPRO必须是有效的?或者它可以是假的?是的,PRO也必须是有效的