Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle 选择与其他表数据完全相同的行_Oracle_Join_Plsql - Fatal编程技术网

Oracle 选择与其他表数据完全相同的行

Oracle 选择与其他表数据完全相同的行,oracle,join,plsql,Oracle,Join,Plsql,我有这些桌子: 产品,文章,产品文章 比如说,产品ID是:p1,p2文章ID是:a1,a2,a3 产品包括: (p1,a1) (p1,a2) (p2,a1) (p2,a1) (p2,a2) (p2,a3) 如何查询产品id,它只有a1、a2,没有更少,没有更多?已更新尝试 SELECT p.* FROM products p JOIN ( SELECT product_id FROM product_articles GROUP BY product_id

我有这些桌子: 产品文章产品文章

比如说,产品ID是:p1p2文章ID是:a1a2a3 产品包括:

  • (p1,a1)
  • (p1,a2)
  • (p2,a1)
  • (p2,a1)
  • (p2,a2)
  • (p2,a3)

如何查询产品id,它只有a1、a2,没有更少,没有更多?

已更新尝试

SELECT p.* 
  FROM products p JOIN 
(
  SELECT product_id
    FROM product_articles
   GROUP BY product_id
  HAVING COUNT(*) = SUM(CASE WHEN article_id IN (1, 2) THEN 1 ELSE 0 END)
     AND SUM(CASE WHEN article_id IN (1, 2) THEN 1 ELSE 0 END) = 2
) q ON p.product_id = q.product_id


这里是两个查询的演示

更新尝试

SELECT p.* 
  FROM products p JOIN 
(
  SELECT product_id
    FROM product_articles
   GROUP BY product_id
  HAVING COUNT(*) = SUM(CASE WHEN article_id IN (1, 2) THEN 1 ELSE 0 END)
     AND SUM(CASE WHEN article_id IN (1, 2) THEN 1 ELSE 0 END) = 2
) q ON p.product_id = q.product_id

这是两个查询的演示

这是一个“集合中的集合”子查询的示例。我主张在逻辑中使用包含子句的
聚合,因为这是表达关系的最通用方法

其思想是,您可以使用类似于使用
where
语句的方式来计算产品中物品的外观(在本例中)。代码有点复杂,但它提供了灵活性。在您的情况下,这将是:

select pa.product_id
from product_articles pa
group by pa.product_id
having sum(case when pa.article_id = 'a1' then 1 else 0 end) > 0 and
       sum(case when pa.article_id = 'a2' then 1 else 0 end) > 0 and
       sum(case when pa.article_id not in ('a1', 'a2') then 1 else 0 end) = 0;
前两个条款统计两个条款的外观,确保每个条款至少出现一次。最后一个计算没有这两个项目的行数,确保没有

您可以看到,这很容易推广到更多的文章。或者查询您有“a1”和“a2”,但没有“a3”。或者您有四篇文章中的三篇,依此类推。

这是“集合中的集合”子查询的一个示例。我主张在逻辑中使用包含
子句的
聚合,因为这是表达关系的最通用方法

其思想是,您可以使用类似于使用
where
语句的方式来计算产品中物品的外观(在本例中)。代码有点复杂,但它提供了灵活性。在您的情况下,这将是:

select pa.product_id
from product_articles pa
group by pa.product_id
having sum(case when pa.article_id = 'a1' then 1 else 0 end) > 0 and
       sum(case when pa.article_id = 'a2' then 1 else 0 end) > 0 and
       sum(case when pa.article_id not in ('a1', 'a2') then 1 else 0 end) = 0;
前两个条款统计两个条款的外观,确保每个条款至少出现一次。最后一个计算没有这两个项目的行数,确保没有


您可以看到,这很容易推广到更多的文章。或者查询您有“a1”和“a2”,但没有“a3”。或者您有四篇特定文章中的三篇,依此类推。

我相信这完全可以通过使用关系连接来实现,如下所示:

SELECT DISTINCT pa1.PRODUCT_ID
  FROM PRODUCT_ARTICLES pa1
  INNER JOIN PRODUCT_ARTICLES pa2
    ON (pa2.PRODUCT_ID = pa1.PRODUCT_ID)
  LEFT OUTER JOIN (SELECT *
                     FROM PRODUCT_ARTICLES
                     WHERE ARTICLE_ID NOT IN (1, 2)) pa3
    ON (pa3.PRODUCT_ID = pa1.PRODUCT_ID)
  WHERE pa1.ARTICLE_ID = 1 AND
        pa2.ARTICLE_ID = 2 AND
        pa3.PRODUCT_ID IS NULL
SQLFiddle


内部联接查找与我们关心的文章相关联的产品(文章1和2-生成产品1和2)。左侧外部查找与我们不关心的文章(除1和2之外的任何文章)关联的产品,然后只接受没有任何不需要的文章的产品(即
pa3.PRODUCT\u ID为NULL
,表示未加入
pa3
中的任何行).

我相信完全可以使用关系连接来实现这一点,如下所示:

SELECT DISTINCT pa1.PRODUCT_ID
  FROM PRODUCT_ARTICLES pa1
  INNER JOIN PRODUCT_ARTICLES pa2
    ON (pa2.PRODUCT_ID = pa1.PRODUCT_ID)
  LEFT OUTER JOIN (SELECT *
                     FROM PRODUCT_ARTICLES
                     WHERE ARTICLE_ID NOT IN (1, 2)) pa3
    ON (pa3.PRODUCT_ID = pa1.PRODUCT_ID)
  WHERE pa1.ARTICLE_ID = 1 AND
        pa2.ARTICLE_ID = 2 AND
        pa3.PRODUCT_ID IS NULL
SQLFiddle


内部联接查找与我们关心的文章相关联的产品(文章1和2-生成产品1和2)。左侧外部查找与我们不关心的文章(除1和2之外的任何文章)关联的产品,然后只接受没有任何不需要的文章的产品(即
pa3.PRODUCT\u ID为NULL
,表示未加入
pa3
中的任何行).

Oracle数据库PL/SQLOracle数据库PL/SQLI读作“不少于”,意思是产品必须同时具有
a1
a2
(当然可能是错误的);这“修复”这个问题,可能有更好的方法……让COUNT(*)(从(1,2)中的article_id所在的文章中选择COUNT(article_id))应该可以吗?@AlexPoole在OP的例子中(product_id,article_id)是一个PK,因此UNIQE。因此不可能有重复的。所以,我认为这个问题完全是按照要求进行的。没什么,我喜欢它,但在教员方面,我们并没有学习这个案例,所以他们不允许it@JovanMeshkov另一种方法见更新答案,joinsI读为“不少于”,意思是产品必须同时具有
a1
a2
(当然可能是错误的);这“修复”这个问题,可能有更好的方法……让COUNT(*)(从(1,2)中的article_id所在的文章中选择COUNT(article_id))应该可以吗?@AlexPoole在OP的例子中(product_id,article_id)是一个PK,因此UNIQE。因此不可能有重复的。所以,我认为这个问题完全是按照要求进行的。没什么,我喜欢它,但在教员方面,我们并没有学习这个案例,所以他们不允许it@JovanMeshkov请参阅更新的答案,了解使用联接的另一种方法