Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从一列中选择值而不是选择值,然后合并结果_Sql - Fatal编程技术网

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也必须是有效的