我正在尝试查找一个表中但不是另一个表中的行,这两个表位于不同的数据库中,并且在我用来匹配的列上也有不同的列名。
我有一个查询,下面的代码,我认为它可能有效,但它太慢了:
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
答案 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.id
,pd.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%;
}
}