我在这张桌子上查询:
SKU
aaaa
bbbb
bbbb
NULL
Run Code Online (Sandbox Code Playgroud)
这是查询:
select *
from TEST as N
where N.SKU NOT IN (select SKU
from TEST
group by SKU
having count(*)>1);
Run Code Online (Sandbox Code Playgroud)
我希望查询返回'aaaa',但是它不返回任何内容.
我期望的原因是因为下面的子查询只返回'bbbb':
select SKU
from TEST
group by SKU
having count(*)>1
Run Code Online (Sandbox Code Playgroud)
因此,'aaaa'不在子查询结果中.
要显示错误,请在MySQL IDE中复制并粘贴这些语句以创建模式:
drop table if exists TEST;
create table TEST(
SKU varchar(255)
);
insert into TEST values('aaaa'),('bbbb'),('bbbb'),(NULL);
Run Code Online (Sandbox Code Playgroud) 假设有一个这样的表:
f1 f2
----------
1 3
4 8
6 4
NULL 1
Run Code Online (Sandbox Code Playgroud)
以下查询按预期工作:
SELECT f2
FROM Table_1 a
WHERE NOT EXISTS (SELECT *
FROM Table_1
WHERE a.f2 = f1)
Run Code Online (Sandbox Code Playgroud)
...和结果集是:
f2
---
3
8
Run Code Online (Sandbox Code Playgroud)
...但类似的查询IN没有返回任何内容:
SELECT f2
FROM Table_1 a
WHERE f2 NOT IN (SELECT b.f1
FROM Table_1 b)
Run Code Online (Sandbox Code Playgroud)
有什么问题 ?
我有2张桌子 - reservation:
id | some_other_column
----+------------------
1 | value
2 | value
3 | value
Run Code Online (Sandbox Code Playgroud)
第二个表 - reservation_log:
id | reservation_id | change_type
----+----------------+-------------
1 | 1 | create
2 | 2 | create
3 | 3 | create
4 | 1 | cancel
5 | 2 | cancel
Run Code Online (Sandbox Code Playgroud)
我只需选择未取消的预订(在此示例中仅为ID 3).我可以通过一个简单的WHERE change_type = cancel条件轻松选择取消,但我正在努力与NOT取消,因为简单WHERE在这里不起作用.
它是预期,当我测试,如果空值是不是在列表中,结果始终是假的.
那是:
select 'Hello world' where null not in(1,2,3);
Run Code Online (Sandbox Code Playgroud)
不要选择任何内容,因为(1,2,3)中的null不为false.
我不明白这一点,因为列表(1,2,3)不包含任何未定义的值(null)所以我希望不在(1,2,3)中的null为真.那么为什么这是假的?
+-------------------+ +-------------------+ +---------------------+
| Service | | Asset | | AssetService |
+-------------------+ +-------------------+ +---------------------+
| Id | Name | | Id | Name | | AssetId | ServiceId |
|-------------------| |-------------------| |---------------------|
| 1 | Service 1 | | 1 | Asset 1 | | 1 | 1 |
| 2 | Service 2 | | 2 | Asset 2 | | 1 | 2 |
| 3 | Service 3 | | 3 | Asset 3 | | …Run Code Online (Sandbox Code Playgroud) 我有三列的表:taxon_id,scientific_name_element_id,和parent_id.我想找到孩子而不是父母的元素,所以结构的终点.
我找到了一些建议我使用的消息来源
select taxon_id
from taxon_name_element
where taxon_id not in
(select parent_id from taxon_name_element)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,当我能够实际浏览条目并看到有例如a taxon_id=1和NO 时,我得到一个空集.parent_id=1
相反,当我看到parent_id中的taxon_id是什么时,我得到一个非空的结果集
我究竟做错了什么?我怎样才能解决这个问题?
我想知道他们是否更好地做这样的事情:
SELECT *
FROM tableA
WHERE colour='red' OR colour='greed' OR colour='blue' OR colour='yellow'
Run Code Online (Sandbox Code Playgroud)
他们是这样的:
SELECT *
FROM tableA
WHERE colour='red''greed''yellow'
Run Code Online (Sandbox Code Playgroud)
提前喝彩
当我使用这段代码时
WHEN col1 NOT IN (SELECT col2 FROM table_name) THEN 'something'
Run Code Online (Sandbox Code Playgroud)
知道 col2 包含 NULL 值,它没有给出预期结果,为什么会发生这种情况?将 IN 与 NULL 值一起使用是否会扰乱内存中存储的数据还是什么?
如果我需要选择一个数据来覆盖其他一些数据,我应该采用什么方法来构建我的SQL查询?
例如,我的
我想要从数据库中选择所有数据除了这个结果集:
SELECT *
FROM table1
WHERE table1.MarketTYpe = 'EmergingMarkets'
AND IsBigOne = 1
AND MarketVolume = 'MIDDLE'
AND SomeClass = 'ThirdClass'
Run Code Online (Sandbox Code Playgroud)
我应该用吗?
你能建议吗?
如果我跑
Select distinct CompanyID from Device
Run Code Online (Sandbox Code Playgroud)
我得到6排.如果我跑
Select CompanyID from Company
Run Code Online (Sandbox Code Playgroud)
我得到了8441行.如果我运行以下内容:
如果我跑
Select CompanyID
from Company where CompanyID NOT IN
(
Select distinct CompanyID from Device
)
Run Code Online (Sandbox Code Playgroud)
我应该让那些不在原始选择声明中的8435家公司,对吗?
但是,当我运行它时,我得到0行.这是什么问题?上述6个结果中的一个是null,但这无关紧要.
谢谢!
编辑:有了Marc-s的帮助,我能够得到以下声明成为我需要的东西,我仍然觉得这个查询还有一个额外的步骤,有人想加入这个吗?
DELETE from Company where CompanyID NOT IN
(
Select C.CompanyID
from Company C where C.CompanyID IN
(
Select distinct CompanyID from Device
)
OR CompanyID IN
(
Select distinct CustomerID from Device
)
OR CompanyID IN
(
Select distinct CompanyID from AssignedCompanies
)
)
Run Code Online (Sandbox Code Playgroud) 这是我的Table1
personid
1
?
2
3
4
?
6
Run Code Online (Sandbox Code Playgroud)
这是我的查询
select *
from table2
where personid not in
(
select personid
from table1
)
Run Code Online (Sandbox Code Playgroud)
结果是 nothing
这是我的第二个查询
select *
from table2
where personid not in
(
select personid
from table1
where personid is not null
)
Run Code Online (Sandbox Code Playgroud)
结果是 ok
问题:为什么第一个查询不起作用?我看不出任何逻辑问题.是的,是否可以null提升teradata?
sql ×8
mysql ×3
sql-server ×2
t-sql ×2
database ×1
exists ×1
filtering ×1
inner-join ×1
null ×1
oracle ×1
php ×1
postgresql ×1
sql-in ×1
subtraction ×1
teradata ×1
where-clause ×1