如果满足不同条件,请选择两个不同的项目

时间:2020-02-18 07:15:20

标签: sql sql-server

我在选择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列出这两个项目。 以及所有其他符合此条件的物品。

5 个答案:

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

Here is a dbfiddle link

Result

答案 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)