免责声明:我已经找到了问题(我认为),但我想将此问题添加到Stack Overflow,因为我无法(轻松)在任何地方找到它.此外,有人可能会比我更好的答案.
我有一个数据库,其中一个表"Common"被其他几个表引用.我想看看Common表中的哪些记录是孤立的(即没有来自任何其他表的引用).
我运行了这个查询:
select *
from Common
where common_id not in (select common_id from Table1)
and common_id not in (select common_id from Table2)
Run Code Online (Sandbox Code Playgroud)
我知道有孤立的记录,但没有返回任何记录.为什么不?
(这是SQL Server,如果重要的话.)
我有两个数据库,一个保存库存,另一个包含主数据库记录的子集.
以下SQL语句不起作用:
SELECT stock.IdStock
,stock.Descr
FROM [Inventory].[dbo].[Stock] stock
WHERE stock.IdStock NOT IN
(SELECT foreignStockId FROM
[Subset].[dbo].[Products])
Run Code Online (Sandbox Code Playgroud)
不是不起作用.删除NOT会得到正确的结果,即两个数据库中的产品.但是,使用NOT IN并不会返回任何结果.
我做错了什么,有什么想法吗?
我需要构建一个查询,它将向我显示表1中的记录,但不在表2中,基于make-model-serial数字组合.
我知道有4条记录不同,但我的查询总是空白.
SELECT *
FROM Table1 WHERE MAKE+MODEL+[Serial Number] NOT IN
(SELECT make+model+[serial number] FROM Table2)
Run Code Online (Sandbox Code Playgroud)
表1有5条记录.
当我将查询更改为时IN,我得到1条记录.我做错了NOT什么?
如何在 CLAUSE 中的mysql 中处理NULL值
我尝试了
SELECT * FROM mytable WHERE field IN(1,2,3,NULL)
Run Code Online (Sandbox Code Playgroud)
它不起作用
只有像:
SELECT * FROM mytable WHERE field IN(1,2,3) OR field IS NULL
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它发挥作用WHERE IN?有可能的 ?
问题
我正在尝试使用 Django ORM 来执行 SQLNOT IN子句的等效操作,在子选择中提供 ID 列表以从日志记录表中带回一组记录。我不知道这是否可能。
该模型
class JobLog(models.Model):
job_number = models.BigIntegerField(blank=True, null=True)
name = models.TextField(blank=True, null=True)
username = models.TextField(blank=True, null=True)
event = models.TextField(blank=True, null=True)
time = models.DateTimeField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
我试过的
我的第一次尝试是使用exclude,但这确实NOT否定了整个Subquery,而不是所需的NOT IN:
query = (
JobLog.objects.values(
"username", "job_number", "name", "time",
)
.filter(time__gte=start, time__lte=end, event="delivered")
.exclude(
job_number__in=models.Subquery(
JobLog.objects.values_list("job_number", flat=True).filter(
time__gte=start, time__lte=end, event="finished",
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这产生了这个 SQL:
SELECT "view_job_log"."username", "view_job_log"."group", "view_job_log"."job_number", "view_job_log"."name", "view_job_log"."time"
FROM "view_job_log"
WHERE ( …Run Code Online (Sandbox Code Playgroud) 当我尝试计算没有select语句指定的varchar值的行数时,我遇到了一个奇怪的情况.好吧,这对我来说听起来很混乱,所以让我举个例子:
假设我在"SomeTable"中有一个字段"MyField",我想要计算MyField值不属于"SomeOtherTable"中"MyOtherField"值定义的域的行数.换句话说,假设我有MyOtherField = {1,2,3},我想要计算MyField值不是1,2或3的行数.为此,我将使用以下查询:
SELECT COUNT(*) FROM SomeTable
WHERE ([MyField] NOT IN (SELECT MyOtherField FROM SomeOtherTable))
Run Code Online (Sandbox Code Playgroud)
它就像一个魅力.但请注意,MyField和MyOtherField是int类型.如果我尝试运行完全相同的查询,除了varchar类型的字段,它的返回值是0,即使我知道有错误的值,我把它们放在那里!然而,如果我只是通过在上面的查询中抑制"NOT"子句来尝试计算相反的数量(域中有多少行与我想要的行数相反,那是多少行不是)...嗯,这就是作品!¬¬
是的,必须有大量的解决方法,但我想知道为什么它不会按照应有的方式工作.此外,我不能简单地改变整个查询,因为大部分内容是在C#代码中构建的,基本上我唯一可以自由更改的部分对软件的任何其他部分都没有影响的是select语句对应于域(NOT IN子句中的任何内容).我希望我能说清楚,有人可以帮助我.
提前致谢.
为什么进行比较value,以null返回false,使用时除外NOT IN,它返回true?
给定查询以查找具有帖子的所有stackoverflow用户:
SELECT * FROM Users
WHERE UserID IN (SELECT UserID FROM Posts)
Run Code Online (Sandbox Code Playgroud)
这按预期工作; 我得到一个有帖子的所有用户的列表.
现在查询逆; 找到所有没有帖子的stackoverflow用户:
SELECT * FROM Users
WHERE UserID NOT IN (SELECT UserID FROM Posts)
Run Code Online (Sandbox Code Playgroud)
这不返回任何记录,这是不正确的.
给出假设数据1
Users Posts
================ ===============================
UserID Username PostID UserID Subject
------ -------- ------- ------ ----------------
1 atkins 1 1 Welcome to stack ov...
2 joels 2 2 Welcome all!
... ... ... ...
399573 gt6989b ... ...
... …Run Code Online (Sandbox Code Playgroud) 我有这样的情况:
ids = [None, None, None]
foo = Foo.objects.filter(common=True).exclude(id__in=ids)
Run Code Online (Sandbox Code Playgroud)
这似乎总是排除一切。
为什么会像这种情况一样id受到id__in威胁?也没有用。我希望它不会排除任何内容,因为所有对象都有有效的 ID。Nonepk__in
foo = Foo.objects.filter(common=True)
Run Code Online (Sandbox Code Playgroud)
按预期返回所有对象。
我在这张桌子上查询:
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) sql ×5
sql-server ×5
mysql ×3
null ×3
t-sql ×3
django ×2
python ×2
celko ×1
django-orm ×1
not-exists ×1
notin ×1
postgresql ×1
where-clause ×1