首页 > 解决方案 > 如果它们满足不同的条件,则选择两个不同的项目

问题描述

我对 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=3ItemGroup = XXX,在同一张发票中。这是我的代码:

SELECT
*
FROM
TABLE_A 
WHERE
(ItemUniqueNo IN (SELECT ItemUniqueNo FROM TABLE_B WHERE ItemGroup='XXX') OR ItemUniqueNo = 3)

使用此代码,我列出了具有ItemGroup = XXXItemUniqueNo=3但我想在同一张发票中同时满足这两个条件的所有项目,例如:

Invoice 1
ItemUniqueNo    ItemName    InvoceNo
1               A           123  --->  This meets 'XXX' ItemGroup condition
3               C           123  --->  This meets '3' ItemUniqueNo condition

这张发票同时满足两个条件,所以我想用 InvoceNo 列出这两个项目。以及符合此条件的所有其他项目。

标签: sqlsql-server

解决方案


您可以在 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

这是一个 dbfiddle 链接

结果


推荐阅读