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

w80xi6nr  于 2022-11-07  发布在  DB2
关注(0)|答案(5)|浏览(185)

我正在使用DB2开发一个应用程序,
我有表products、price和cost,这些表以如下方式存储产品数据:

正如您所看到的,在本例中,产品可能有价格,但没有分配成本(因此该行不存在,这不像产品的成本可以为空)。
我想做的是获取所有分配了价格但未分配成本的产品的id,因此结果应该是:

我想我不能做外部左或右连接,因为为了做,我需要两个表(价格和成本)都有id。
我不太确定我使用的是什么版本的DB2(我使用的是与DB2交互的预配置软件),因此如果您使用SQL Server语法,它将对我有所帮助,因为它与DB2非常相似。
英译汉有人能帮我吗?

vs91vp4v

vs91vp4v1#

这是一个简单的left join/where

select p.id
from price p left join
     cost c
     on p.id = c.id
where c.id is null;

您也可以使用not exists(和not in,但在使用子查询时我不建议这样做)。

fhg3lkii

fhg3lkii2#

在这种情况下,可以使用左联接:

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 Server left join的更多信息

j8yoct9x

j8yoct9x3#

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

select p.id from price p 
where not exists (
  select 1 from cost
  where id = p.id
)

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

t2a7ltrp

t2a7ltrp4#

在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)
58wvjzkj

58wvjzkj5#

由于这个问题是一般性的,我来这里是为了寻找关于使用LINQ连接的进一步解释,我想我应该在这里发布我的解决方案。我使用了LEFT OUTER JOIN in LINQ上的帖子,它有一个详细的示例,我修改了它以适合这个示例,然后将它输入到LINQPad中。

void Main()
{
    var Products = new List<Tuple<int, string>>
    {
        new Tuple<int,string>(1, "Product A"),
        new Tuple<int,string>(2, "Product B"),
        new Tuple<int,string>(3, "Product C"),
        new Tuple<int,string>(4, "Product D"),
        new Tuple<int,string>(5, "Product E")       
    };

    var Prices = new List<System.Tuple<int, decimal>>
    {
        new Tuple<int,decimal>(1, 100),
        new Tuple<int,decimal>(2, 150),
        new Tuple<int,decimal>(3, 20),
        new Tuple<int,decimal>(4, 90),
        new Tuple<int,decimal>(5, 120)
    };

    var Costs = new List<System.Tuple<int, decimal>>
    {
        new Tuple<int,decimal>(1, 50),
        new Tuple<int,decimal>(2, 75)       
    };      

    var query2 = 
        from products in Products
        from prices in Prices
            .Where(price => price.Item1 == products.Item1)
            .DefaultIfEmpty() // <== makes join a left join
        from costs in Costs
            .Where(cost => cost.Item1 == prices.Item1)
            .DefaultIfEmpty() // <== makes join a left join

        select new
        {
            ID = products.Item1,
            Product = products.Item2,
            Prices = prices.Item2,              
            Costs = costs != null ? costs.Item2.ToString("C2") : "No Cost"
        };

    var xy = query2.ToList();

    xy.Dump();  // Dump() <== Linqpad command to create output
}

相关问题