从一个表中选择不在另一个表中

时间:2011-09-29 10:38:40

标签: mysql sql

我正在尝试查找一个表中但不是另一个表中的行,这两个表位于不同的数据库中,并且在我用来匹配的列上也有不同的列名。

我有一个查询,下面的代码,我认为它可能有效,但它太慢了:

SELECT `pm`.`id`
FROM `R2R`.`partmaster` `pm`
WHERE NOT EXISTS (
    SELECT * 
    FROM `wpsapi4`.`product_details` `pd`
    WHERE `pm`.`id` = `pd`.`part_num`
)

因此查询尝试执行如下操作:

从R2R.partmaster数据库中选择不在wpsapi4.product_details数据库中的所有ID。我匹配的列是partmaster.id& product_details.part_num

4 个答案:

答案 0 :(得分:89)

扩展Sjoerd的反连接,您还可以使用易于理解的SELECT WHERE X NOT IN (SELECT)模式。

SELECT pm.id FROM r2r.partmaster pm
WHERE pm.id NOT IN (SELECT pd.part_num FROM wpsapi4.product_details pd)

请注意,您只需要对保留字,带空格的名称等使用`反引号,而不是使用普通的列名。

在MySQL 5+上,这种查询运行速度非常快 在MySQL 3/4上它很慢。

确保您对相关字段包含索引
您需要在pm.idpd.part_num上建立索引。

答案 1 :(得分:58)

你可以LEFT JOIN两个表。如果第二个表中没有对应的行,则值为NULL。

SELECT id FROM partmaster LEFT JOIN product_details ON (...) WHERE product_details.part_num IS NULL

答案 2 :(得分:3)

因此,网上有很多帖子显示了如何做到这一点,我发现了3种方式,与Johan& amp; Sjoerd。我无法使这些查询工作,显然它们工作正常,这是我的数据库无法正常工作,而且这些查询都运行缓慢。

所以我找到了其他人可能会觉得有用的另一种方式:

它的基本要点是创建一个临时表并用所有信息填充它,然后删除另一个表中的所有行。

所以我做了这3个查询,并且很快就跑了(好几分钟)。

CREATE TEMPORARY TABLE

`database1`.`newRows`

SELECT

`t1`.`id` AS `columnID`

FROM

`database2`.`table` AS `t1`

CREATE INDEX `columnID` ON `database1`.`newRows`(`columnID`)

DELETE FROM `database1`.`newRows`

WHERE

EXISTS(
    SELECT `columnID` FROM `database1`.`product_details` WHERE `columnID`=`database1`.`newRows`.`columnID`
)

答案 3 :(得分:3)

要扩展Johan的答案,如果子选择中的part_num列可以包含空值,那么查询将会中断。

要更正此问题,请添加空检查...

.carousel-inner {
    position: relative;
    overflow: hidden;
    width: 100%;

    > .item {
      display: none;
      position: relative;
      .transition(.6s ease-in-out left);

      // Account for jankitude on images
      > img,
      > a > img {
        &:extend(.img-responsive);
        line-height: 1;
      }

      // WebKit CSS3 transforms for supported devices
      @media all and (transform-3d), (-webkit-transform-3d) {
          .transition-transform(~'0.6s ease-in-out');
          .backface-visibility(~'hidden');
          .perspective(1000px);

          &.next,
          &.active.right {
            .translate3d(16.6%, 0, 0);
            left: 0;
          }
          &.prev,
          &.active.left {
            .translate3d(-16.6%, 0, 0);
            left: 0;
          }
          &.next.left,
          &.prev.right,
          &.active {
            .translate3d(0, 0, 0);
            left: 0;
          }
      }
    }

    .active,
    .next,
    .prev {
        display: block;

    }
    .active {
        left: 0;
    }

    .next,
    .prev {
      position: absolute;
      top: 0;
      width: 100%;
    }

    .next {
      left: 16.6%;
    }
    .prev {
      left: -16.6%;
    }
    .next.left,
    .prev.right {
      left: 0;
    }

    .active.left {
      left: -16.6%;
    }
    .active.right {
      left: 16.6%;
    }

  }
  • 抱歉,我无法添加评论,因为我没有代表!