Sql 如何选择不在表B中但在表A中的行(左连接)

Sql 如何选择不在表B中但在表A中的行(左连接),sql,db2,Sql,Db2,我正在使用DB2开发一个应用程序 我有表products、price和cost,这些表以这种方式存储产品数据: 正如您所看到的,在本例中,产品可能有一个价格,但没有分配成本,因此该行不存在,这不像产品可以有成本=null 我想做的是获取产品的所有ID,这些ID分配给价格而不是成本,因此结果应该是: 我想我不能做外部的左或右连接,因为为了做到这一点,我需要两个表price和cost,以便在它们上面都有ID 我不太确定我使用的是什么版本的DB2,我预先配置了与DB2交互的软件,所以如果您使用SQL

我正在使用DB2开发一个应用程序

我有表products、price和cost,这些表以这种方式存储产品数据:

正如您所看到的,在本例中,产品可能有一个价格,但没有分配成本,因此该行不存在,这不像产品可以有成本=null

我想做的是获取产品的所有ID,这些ID分配给价格而不是成本,因此结果应该是:

我想我不能做外部的左或右连接,因为为了做到这一点,我需要两个表price和cost,以便在它们上面都有ID

我不太确定我使用的是什么版本的DB2,我预先配置了与DB2交互的软件,所以如果您使用SQL Server语法,它将对我有所帮助,因为它与DB2非常相似

谁能帮帮我吗

这是一个简单的左连接/其中:

您也可以使用not exists和not in,但我不建议在使用子查询时使用该选项。

这是一个简单的左连接/where:


您也可以使用not exists和not in,但我不建议在使用子查询时使用。在这种情况下,您可以使用left join:

SELECT
    select_list
FROM
    T1
LEFT JOIN T2 ON
    join_predicate;
带有where子句的示例:

SELECT Customers.CustomerName
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
WHERE Orders.CustomerID is null

有关

的详细信息您可以在这种情况下使用左连接:

SELECT
    select_list
FROM
    T1
LEFT JOIN T2 ON
    join_predicate;
带有where子句的示例:

SELECT Customers.CustomerName
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
WHERE Orders.CustomerID is null

有关

的详细信息此情况是SQL中存在和不存在语句的原因:


它是不言自明的,在这种简单的情况下比其他解决方案更有效。

这种情况就是SQL中存在和不存在语句的原因:

它是不言自明的,在这种简单的情况下比其他解决方案更有效。

在DB2中,它应该是:

SELECT product.id
FROM product 
INNER JOIN price ON product.id= price.fkProductID
WHERE NOT EXISTS (SELECT id FROM cost
                    WHERE cost.fkProductID = product.id) 
在DB2中,它将是:

SELECT product.id
FROM product 
INNER JOIN price ON product.id= price.fkProductID
WHERE NOT EXISTS (SELECT id FROM cost
                    WHERE cost.fkProductID = product.id) 

这是一个好问题。您的问题已被正确编辑。这是清楚的。你举了一个例子。继续努力@Rodolfo Bocanegray你不是新来的。您不应将信息发布为图像,因为这会阻止其他人搜索信息,并阻止他们使用复制/粘贴来帮助研究/解决您的问题。此外,您的问题与sql server无关-已删除该标记。SQL Server和DB2使用不同的SQL方言-除了最简单的查询之外,尝试使用tsql只会使事情变得混乱。这是一个好问题。您的问题已被正确编辑。这是清楚的。你举了一个例子。继续努力@Rodolfo Bocanegray你不是新来的。您不应将信息发布为图像,因为这会阻止其他人搜索信息,并阻止他们使用复制/粘贴来帮助研究/解决您的问题。此外,您的问题与sql server无关-已删除该标记。SQLServer和DB2使用不同的SQL方言-除了最简单的查询之外,如果尝试使用tsql,您只会混淆事情。非常好。非常好用,非常好。工作完美。