代码之家  ›  专栏  ›  技术社区  ›  expenguin

SQL根据列从表B中选择,但根据表A ID获取所有行

  •  0
  • expenguin  · 技术社区  · 7 年前

    所以今天早上我打瞌睡了。

    下面列出了两张桌子。

    TABLE A
    InvoiceNo | Total
    000001    | $100
    000002    | $50
    000003    | $200
    etc..
    
    TABLE B
    InvoiceNo | ItemCode
    000001    | Item-A
    000001    | Item-B
    000001    | Item-C
    000002    | Item-A
    000003    | Item-B
    000003    | Item-D
    etc...
    

    我需要从表2中选择存在ITEM-B的位置,但也需要根据InvoiceNo获取所有其他项目。因此,它应该抓取ItemCode>发票编号(>);基于该发票的所有项目编号

    OUTPUT
    InvoiceNo | Total | ItemCode
    000001    | $100  | Item-A
    000001    | $100  | Item-B
    000001    | $100  | Item-C
    000003    | $200  | Item-B
    000003    | $200  | Item-D
    

    我当前使用的查询是:

    SELECT a.InvoiceNo, a.Total, b.ItemCode FROM TableA a
    LEFT JOIN TABLE B b ON a.InvoiceNo = b.InvoiceNo
    WHERE b.ItemCode = 'Item-B'
    

    这将生成以下输出

    INCORRECT OUTPUT
    InvoiceNo | Total | ItemCode
    000001    | $100  | Item-B
    000003    | $200  | Item-B
    

    我不太清楚如何处理这个问题,如果有任何线索或帮助,我们将不胜感激。

    干杯

    2 回复  |  直到 7 年前
        1
  •  6
  •   John Woo    7 年前

    有很多方法可以做到这一点。一种方法是使用 EXISTS

    SELECT  a.InvoiceNo, A.Total, B.ItemCode
    FROM    TableA a
            INNER JOIN TableB b
                ON a.InvoiceNo = b.InvoiceNo
    WHERE   EXISTS (SELECT 1
                    FROM TableB c
                    WHERE b.InvoiceNo = c.InvoiceNo
                            AND c.ItemCode = 'Item-B')
    

    这里有一个 Demo .

    另一种方法是使用 INNER JOIN 在仅获取所有发票的子查询上 ItemB

    SELECT  a.InvoiceNo, A.Total, B.ItemCode
    FROM    TableA a
            INNER JOIN TableB b
                ON a.InvoiceNo = b.InvoiceNo
            INNER JOIN (SELECT InvoiceNo FROM TableB c WHERE ItemCode = 'Item-B') c
                ON a.InvoiceNo = c.InvoiceNo
    

    这里有一个 Demo .

        2
  •  1
  •   Thom A    7 年前

    似乎是你想要的:

    USE Sandbox;
    GO
    
    CREATE TABLE TABLEA (InvoiceNo varchar(6),
                         Total int)
    
    CREATE TABLE TABLEB (InvoiceNo varchar(6),
                         ItemCode varchar(6));
    GO
    INSERT INTO TABLEA
    VALUES ('000001',100),
           ('000002',50 ),
           ('000003',200);
    INSERT INTO TABLEB
    VALUES ('000001','Item-A'),
           ('000001','Item-B'),
           ('000001','Item-C'),
           ('000002','Item-A'),
           ('000003','Item-B'),
           ('000003','Item-D');
    GO
    SELECT B.InvoiceNo,
           A.Total,
           B.ItemCode
    FROM TABLEB B
         JOIN TABLEA A ON B.InvoiceNo = A.InvoiceNo
    WHERE EXISTS(SELECT 1
                 FROM TABLEB sq
                 WHERE B.InvoiceNo = sq.InvoiceNo
                   AND sq.ItemCode = 'Item-B')
    ORDER BY B.InvoiceNo, B.ItemCode;
    
    GO
    DROP TABLE TABLEA;
    DROP TABLE TABLEB;