我有以下两个表和列
表1:transactionid
表2:transactionid和status
如果table2中不存在相同的transactionid,我需要从表1中获得结果
如果table2中存在相同的transactionid,但状态不同于2,那么它不应该返回table1行
如果table2中存在相同的transactionid且状态为2,那么它应该返回表1行,但我需要知道这一点,所以我可以在我的网站内显示错误
我目前有:
select * from table1 where not exists (select null from table2
WHERE table1.transactionid = table2.transactionid AND status <> 2)
我需要这样的东西(它不能正常工作)
select *, (select count(*) from table2 where table1.transactionid = table2.transactionid AND status = 2) as orderswitherrors from table1 where not exists (select null from table2
WHERE table1.transactionid = table2.transactionid AND status <> 2)
所以在php中我可以检查tableid2中的transactionid是否有错误($ row-&gt; orderswitherrors&gt; 0)......
谢谢
答案 0 :(得分:2)
您可以使用'left join'和case
语句来获取状态的事务ID,并根据状态显示/隐藏错误,例如:
SELECT t1.transactionid,
CASE WHEN t2.status IS NULL THEN 'NOT_EXISTS'
WHEN t2.status = 2 THEN 'ERROR'
END AS state
FROM table1 t1 LEFT JOIN table2 t2 ON t1.transactionid = t2.transactionid
WHERE t2.status IS NULL OR t2.status = 2
ORDER BY t1.transactionid;
这是 SQL Fiddle 。
答案 1 :(得分:1)
我认为你试图使用EXISTS会让自己烦恼不已。
在此查询中,我们只使用连接将Table1和Table2都放入结果集中。我们使用左连接,因此即使Table2中不存在Table1中的行,也会返回它们。如果没有匹配的行,则结果集将包含所有Table2列的NULL。
一旦我们有一个结果集,其中包含两个表,我们只过滤那些行,以便我们只保留行,其中a)表2中没有行,或者(b)有一行,状态= 2
SELECT table1.*,
table2.status
FROM table1
LEFT JOIN table2 ON table1.transactionid = table2.transactionid
WHERE table2.transactionid IS NULL --Doesn't exist in table2
OR table2.status = 2 --Exists in table2 with status 2
答案 2 :(得分:0)
您可以组合使用NOT EXISTS
和EXISTS
:
select t1.*
from table1 t1
where not exists (select 1
from table2 t2
where t1.transactionid = t2.transactionid
) or
exists (select 1
from table2 t2
where t1.transactionid = t2.transactionid and
status = 2
);