【问题标题】:select tables relationship选择表关系
【发布时间】:2015-01-03 13:19:06
【问题描述】:

我需要帮助。我有 3 个这样的表:

product
    * id
    - name

supplier
    * id
    - name
    - active

product_supplier
    * id_product
    * id_supplier

最后一张表是向供应商列出的产品。

我需要构建一个查询,它只返回活跃的供应商,并且仍然与特定产品无关。

谢谢!!

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?

标签: sql select relationship


【解决方案1】:

用下面的子查询试试这个:

SELECT *
FROM supplier
WHERE active = 'Y'
AND id NOT IN (SELECT DISTINCT id_supplier
               FROM product_supplier)

【讨论】:

  • NOT IN 有点危险,因为如果 id_supplier 的值为 NULL,则 NOT IN 将始终为 false,并且根本不会返回任何行。为了安全起见,要么在子查询中添加“WHERE id_supplier IS NOT NULL”,或者更好地使用 NOT EXISTS。此外,在子查询中没有使用 DISTINCT。
  • 同意,但看到 OP 在他的问题中将它们标记为 PK/FK,因此它不能为空。
【解决方案2】:

这是您的问题:“我需要构建一个查询,它只返回活跃的供应商,并且仍然与特定产品无关。”

您正在寻找没有特定产品的活跃供应商。

select s.id
from product_supplier ps join
     supplier s
     on ps.id_supplier = s.id
where s.active = 1
group by s.id
having sum(case when ps.id_product = XX then 1 else 0 end) > 0;

您也可以使用not exists

select s.id
from supplier s
where s.active = 1 and
      not exists (select 1
                  from product_supplier ps
                  where ps.id_supplier = s.id and
                        ps.id_product = XX
                 )

而且,您可以使用left join

select s.*
from supplier s left join
     product_supplier ps
     on ps.id_supplier = s.id and ps.id_product = XX
where s.active = 1 and ps.id_supplier is null;

这似乎是用 SQL 表达这一点的最自然的方式。

【讨论】:

    【解决方案3】:

    非常感谢...它适用于此。

    SELECT * 
    FROM supplier s
    WHERE NOT 
    EXISTS (
    SELECT * 
    FROM product_supplier ps
    WHERE s.id = ps.id_supplier
    AND ps.id_product =5
    )
    AND s.active =1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-30
      • 2011-02-11
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多