0

在此处输入图像描述

此查询给出了分配给产品 id 小于 5 的所有 templateId,这是预期的输出。但是我们希望在不使用 where 子句中的子查询的情况下实现这一点(以红色突出显示)。

如果我只是删除子查询,那么输出将是 templateproduct 表中的所有 templateId。我们不希望那样。我们想要的是仅从产品 1 分配到 5 的模板 id。所以我们的预期输出是:

100 102

今天我们使用额外的子查询来实现这一点,我们想在不使用子查询的情况下获得相同的结果。

我们正在使用 sql 2008

4

3 回答 3

0

这是因为您的 where 子句应该是tp.prod_id <= 5

于 2013-10-10T17:50:37.617 回答
0

不是 100% 确定你的列的布局,但可能是这样的:

SELECT
    TemplateID,
    --Other fields here
FROM
    Product pr INNER JOIN TemplateProduct tp on pr.prod_id = tp.prod_id 
        INNER JOIN Template tr on tp.templateID = tr.templateID AND tr.prod_id = pr.prod_id
WHERE
    tp.prod_id < 5
于 2013-10-10T17:51:19.423 回答
0

您可以使用 LEFT JOIN 代替子查询来执行此操作,并检查 NULL。

SELECT DISTINCT tp.template_id
FROM templateproduct tp
LEFT JOIN templateproduct tp2
  ON tp.template_id = tp2.template_id AND tp2.prod_id IN (6, 7, 8, 9, 10)
WHERE tp.prod_id < 5
  AND tp2.template_id IS NULL

您可以使用 GROUP BY 执行类似的操作,并检查是否有 0 个匹配的模板链接到排除的产品 ID:

SELECT tp.template_id
FROM templateproduct tp
LEFT JOIN templateproduct tp2
  ON tp.template_id = tp2.template_id AND tp2.prod_id IN (6, 7, 8, 9, 10)
WHERE tp.prod_id < 5
GROUP BY tp.template_id
HAVING COUNT(tp2.template_id) = 0

根据您的数据和索引,这可能会或可能不会比子查询更有效 - 我建议您尝试一下。无论如何,根本没有理由使用任何 INNER JOIN 来获得您正在寻找的结果:

SELECT DISTINCT tp.template_id
FROM templateproduct tp
WHERE tp.prod_id < 5
  AND tp.template_id NOT IN (
    SELECT tp2.template_id FROM templateproduct tp2 WHERE tp2.prod_id IN (6, 7, 8, 9, 10)
  )

试试这些,看看哪个更适合你。当然,请检查查询计划以了解原因。

于 2013-10-10T17:53:20.410 回答