SQL SELECT 来自 TABLE B 基于列,但基于 TABLE A ID 抓取所有行
SQL SELECT from TABLE B based on column but grab all rows based on TABLE A ID
今天早上我打瞌睡了。
下面列出了两个 table。
TABLE A
InvoiceNo | Total
000001 | 0
000002 |
000003 | 0
etc..
TABLE B
InvoiceNo | ItemCode
000001 | Item-A
000001 | Item-B
000001 | Item-C
000002 | Item-A
000003 | Item-B
000003 | Item-D
etc...
我需要 select 出 table 2 存在 ITEM-B 的地方,而且还要根据 InvoiceNo 获取所有其他项目。所以它应该获取 ItemCode > InvoiceNo > All Items based on that InvoiceNo
OUTPUT
InvoiceNo | Total | ItemCode
000001 | 0 | Item-A
000001 | 0 | Item-B
000001 | 0 | Item-C
000003 | 0 | Item-B
000003 | 0 | 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 | 0 | Item-B
000003 | 0 | Item-B
我不太确定如何处理这个问题,非常感谢任何线索或帮助。
干杯
有很多方法可以做到这一点。一种方法是使用 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。
似乎是你想要的:
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;
今天早上我打瞌睡了。
下面列出了两个 table。
TABLE A
InvoiceNo | Total
000001 | 0
000002 |
000003 | 0
etc..
TABLE B
InvoiceNo | ItemCode
000001 | Item-A
000001 | Item-B
000001 | Item-C
000002 | Item-A
000003 | Item-B
000003 | Item-D
etc...
我需要 select 出 table 2 存在 ITEM-B 的地方,而且还要根据 InvoiceNo 获取所有其他项目。所以它应该获取 ItemCode > InvoiceNo > All Items based on that InvoiceNo
OUTPUT
InvoiceNo | Total | ItemCode
000001 | 0 | Item-A
000001 | 0 | Item-B
000001 | 0 | Item-C
000003 | 0 | Item-B
000003 | 0 | 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 | 0 | Item-B
000003 | 0 | Item-B
我不太确定如何处理这个问题,非常感谢任何线索或帮助。
干杯
有很多方法可以做到这一点。一种方法是使用 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。
似乎是你想要的:
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;