表B中的SQL SELECT基于列但基于TABLE A ID获取所有行

时间:2018-02-20 14:20:31

标签: sql sql-server one-to-many

所以今天早上我被打得很蠢。

我下面列出了两张表。

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> InvoiceNo>基于InvoiceNo的所有项目

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 个答案:

答案 0 :(得分:5)

有很多方法可以做到这一点。一种方法是使用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

答案 1 :(得分:1)

似乎是你所追求的:

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;