我在选择mssql时遇到了问题;
Invoice 1
ItemUniqueNo ItemName InvoceNo
1 A 123
3 C 123
Table A (All Invoices)
ItemUniqueNo ItemName InvoceNo
1 A 123
2 B 235
3 C 123
Table B (Item List)
ItemUniqueNo ItemName ItemGroup
1 A XXX
2 B YYY
3 C ZZZ
我要选择每个项目(来自表A):如果发票同时具有两种产品类型;在同一张发票中的 ItemUniqueNo = 3 和 ItemGroup = XXX 。这是我的代码:
SELECT
*
FROM
TABLE_A
WHERE
(ItemUniqueNo IN (SELECT ItemUniqueNo FROM TABLE_B WHERE ItemGroup='XXX') OR ItemUniqueNo = 3)
使用此代码,我列出了所有具有 ItemGroup = XXX 和 ItemUniqueNo = 3 但 我想在同一张发票中同时满足这两个条件,例如:
Invoice 1
ItemUniqueNo ItemName InvoceNo
1 A 123 ---> This meets 'XXX' ItemGroup condition
3 C 123 ---> This meets '3' ItemUniqueNo condition
此发票同时满足两个条件,因此我想用InvoceNo列出这两个项目。 以及所有其他符合此条件的物品。
答案 0 :(得分:1)
您可以在where子句中使用case语句代替“ OR”,这样您的输出将与您之前想要的匹配。您可以查看我的答案。
Create table TableA (ItemUniqueNo int, ItemName Char(1), InvoceNo int)
insert into TableA Values
(1, 'A', 123),
(2, 'B', 235),
(3, 'C', 123),
(4, 'A', 999),
(3, 'B', 999)
Create table TableB (ItemUniqueNo int, ItemName Char(1), ItemGroup Varchar(10))
insert into TableB Values
(1, 'A', 'XXX'),
(2, 'B', 'YYY'),
(3, 'C', 'ZZZ'),
(4, 'A', 'XXX')
SELECT TABLEA.*
FROM TABLEA INNER JOIN (SELECT DISTINCT TABLEA.INVOCENO
FROM (SELECT TABLEA.INVOCENO,
(CASE
WHEN ITEMGROUP = 'XXX' THEN 1
WHEN TABLEA.ITEMUNIQUENO = 3 THEN 1
ELSE 0
END)
AS FLAG
FROM TABLEA
INNER JOIN TABLEB
ON CONCAT(TABLEA.ITEMUNIQUENO,TABLEA.ITEMNAME) = CONCAT(TABLEB.ITEMUNIQUENO,TABLEB.ITEMNAME))
TABLEA
WHERE FLAG = 1) COND ON TABLEA.INVOCENO = COND.INVOCENO
答案 1 :(得分:0)
只需将OR
子句中的AND
更改为where
答案 2 :(得分:0)
您可以使用内部联接尝试此操作,如下所示。
Create table TableA (ItemUniqueNo int, ItemName Char(1), InvoceNo int)
insert into TableA Values
(1, 'A', 123),
(2, 'B', 235),
(3, 'C', 123)
Create table TableB (ItemUniqueNo int, ItemName Char(1), ItemGroup Varchar(10))
insert into TableB Values
(1, 'A', 'XXX'),
(2, 'B', 'YYY'),
(3, 'C', 'ZZZ')
SELECT TableA.*
,TableB.ItemGroup
FROM TableA
INNER JOIN TableB ON TableA.ItemUniqueNo = TableB.ItemUniqueNo
WHERE ItemGroup = 'XXX'
OR TableA.ItemUniqueNo = 3
ORDER BY TableA.ItemUniqueNo
这是直播db<>fiddle demo。 您可以尝试的另一种选择
SELECT TableA.*
FROM TableA
INNER JOIN (
SELECT TableA.*
FROM TableA
WHERE EXISTS (
SELECT 1
FROM TableB
WHERE TableA.ItemName = TableB.ItemName
AND TableA.ItemName = 'A'
)
AND EXISTS (
SELECT 1
FROM TableB
WHERE TableA.ItemName = TableB.ItemName
AND TableB.ItemGroup = 'XXX'
)
) TEMP ON TableA.InvoceNo = TEMP.InvoceNo
答案 3 :(得分:0)
尝试
select * from [Table A] A
join [Table B] B on A.ItemUniqueNo=B.ItemUniqueNo
where b.ItemGroup='XXX' or OR A.ItemUniqueNo = 3
答案 4 :(得分:0)
如果要同时满足两个条件,请使用AND关键字。如果您只想满足两个条件中的一个,请使用OR关键字。
SELECT *
FROM TABLE_A
WHERE ItemUniqueNo IN
(SELECT ItemUniqueNo
FROM TABLE_B
WHERE ItemGroup='XXX' AND ItemUniqueNo = 3)