如何基于非条件

时间:2015-06-04 13:11:28

标签: mysql sql

我有两张桌子,比如TableA& TableB定义如下:

  

create table TableA(id int,name varchar(20),partNumber varchar(30));

值为:

insert into TableA values(1,'a1','10');
insert into TableA values(2,'a2','20');
insert into TableA values(3,'a3','30');
insert into TableA values(4,'a4','40');
  

create table TableB(id int,name varchar(20),partNumber   VARCHAR(30));

insert into TableB values(5,'b1','10');
insert into TableB values(6,'b2','20');
insert into TableB values(7,'b3','60');
insert into TableB values(8,'b4','70');

现在,在结果中,我想要加入这两个表并获取TableB中的所有记录,并且仅获取TableATableA's partNumber列值与任何值不匹配的记录价值TableB's partNumber

我已尝试过以下查询,并且所有这些查询都给出了14条不正确的记录。

查询1:

  

选择b.id作为Bid,b.name作为Bname,b.partNumber作为BPart,a.id as   Aid,a.name为Aname,a.partNumber为APart,来自TableB b左连接   表a a on apartNumber!= b.partNumber;

查询2:

  

选择b.id作为Bid,b.name作为Bname,b.partNumber作为BPart,a.id as   Aid,a.name为Aname,a.partNumber为APart,来自TableB b,TableA a   其中a.partNumber!= b.partNumber;

查询3:

  

选择b.id作为Bid,b.name作为Bname,b.partNumber作为BPart,a.id as   Aid,a.name为Aname,a.partNumber为APart,来自TableB b左连接   表a a在a.partNumber上没有(选择a.id作为来自TableB b Aid的Aid)   表a a on a.partNumber = b.partNumber);

有人可以帮助我在这里犯错吗?获得结果的正确方法是什么。

我期待输出如下:

+------+-------+-------+------+-------+-------+
| Bid  | Bname | BPart | Aid  | Aname | APart |
+------+-------+-------+------+-------+-------+
|    5 | b1    | 10    |    3 | a3    | 30    |
|    5 | b1    | 10    |    4 | a4    | 40    |
|    6 | b2    | 20    |    3 | a3    | 30    |
|    6 | b2    | 20    |    4 | a4    | 40    |
|    7 | b3    | 60    |    3 | a3    | 30    |
|    7 | b3    | 60    |    4 | a4    | 40    |
|    8 | b4    | 70    |    3 | a3    | 30    |
|    8 | b4    | 70    |    4 | a4    | 40    |
+------+-------+-------+------+-------+-------+

所以我的意思是在结果中我不希望TableA的记录partNumber10, 20,因为TableB's partNumber中存在值。< / p>

1 个答案:

答案 0 :(得分:4)

您可以使用以下查询:

SELECT id, name, partNumber, Aid, Aname, Apart
FROM TableB AS t
CROSS JOIN (SELECT id AS Aid, name AS Aname, partNumber AS Apart
            FROM TableA AS a
            WHERE NOT EXISTS (SELECT 1
                              FROM TableB AS b
                              WHERE b.partNumber = a.partNumber)) AS c
ORDER BY id    

我们的想法是使用TableA子句从NOT EXISTS中选择所有必需的记录。然后使用CROSS JOIN Table1此查询中的派生表获取所有可能的组合。

Demo here