我正在学习 SQL,所以如果这是一个太基本的问题,我深表歉意。在 GROUP BY 字段之后,我似乎无法弄清楚如何使用 WHERE 子句。
例如,如何使用 WHERE 子句过滤结果以仅查看订单数大于 100 的国家/地区?
谢谢
应如何WHERE
构造子句,例如:
例如,如果我们有这个模式:
CREATE TABLE Items
(
[Id] INT PRIMARY KEY,
[FirstDate] DATETIME,
[SecondDate] DATETIME
);
...有这些记录:
INSERT INTO Items ([Id], [FirstDate], [SecondDate])
VALUES
(1, '2021-1-1', '2022-1-1'),
(2, '2022-1-1', '2023-1-1'),
(3, '2022-1-1', '2024-1-1'),
(4, '2024-1-1', '2025-1-1'),
(5, '2024-1-1', '2026-6-1')
...然后我想过滤FirstDate
and SecondDate
,这样:
FirstDate
andSecondDate
来过滤2022-1-1
,将返回记录 2 和 3(但不是 1!)。FirstDate
andSecondDate
来过滤2024-1-1
,将返回记录 4 和 5(但不是 3!)。FirstDate
andSecondDate
来过滤2025-1-1
,将返回记录 4。我需要更新表中的 varchar 字段,但只有最长的 varchar 记录(其中包含最多的数据。)。我可以通过以下查询轻松找到它:
SELECT TOP(1) options
FROM ForrasReportsRicsiTeszt
ORDER BY LEN(options) DESC
现在我需要更新它,但我对 sql 非常陌生。这是一个 2005 毫秒的 sql 服务器。
我的更新查询:
UPDATE ForrasReportsRicsiTeszt
SET options = REPLICATE(options, 4)
WHERE TOP(1) ORDER BY LEN(options) DESC
这给了我一个 TOP(1) 的错误,这是意料之中的。我只是不知道编写此查询的正确方法,我怎么能只更新最长的 varchar 字段?我设法用我的选择查询得到的那个。可悲的是,没有可以在 WHERE 中使用的主键。
任何帮助将非常感激!
我想知道是否有可能找到仅在第一次出现 where 子句之后出现的记录。我目前在此示例中使用 PostgreSQL,但首选不是 PostgreSQL 特定的东西。
例如,如果我有这样的表
drop table if exists dummy;
create table dummy (
col_a varchar(10),
col_b varchar(10),
col_c varchar(10),
test integer
);
insert into dummy values
('A', 'B', 'C', 1),
('B', 'C', 'A', 2),
('C', 'A', 'B', 3),
('D', 'E', 'F', 4);
如果我运行以下查询,我可以按新顺序获取数据
select * from dummy
order by col_b;
返回
C | A | B | 3
A | B | C | 1
B | C | A | 2
D | E | F | 4
是否可以做一些事情,以便我只能返回在某个 where 子句之后发生的行,例如
select * from dummy
/* where row appears after results 'A', 'B', 'C', 1 */
order by col_b;
要得到
B | C | A | 2
D | E | F | 4
更新
我不使用的原因where col_b > ?
是因为它不适合重复值
在我需要匹配这样的附加列之前,它会起作用
select * from dummy
where col_b > 'B'
and col_c > 'C'
order by col_b;
在这种情况下,它将返回最后一行,因为这两个值都高于截止值,但在第一次出现指定行后它没有截止。
我试图有一个 where 子句可以识别特定行是行
A | B | C | 1
在这种情况下
在我的数据库中,只有一条满足条件iv_title = 'ball skills' 的记录。现在我正在执行以下查询:
SELECT
*
FROM
`imageAndVideo`
WHERE
`iv_title` = 'ball skills' AND `iv_file_type` = 2
ORDER BY
`iv_create`
DESC
LIMIT 1, 6
上面这个查询没有输出任何记录,不知道为什么?有人可以向我解释一下吗?
如果我执行以下(删除 LIMIT)查询,我会得到所需的限制。
SELECT
*
FROM
`imageAndVideo`
WHERE
`iv_title` = 'ball skills' AND `iv_file_type` = 2
ORDER BY
`iv_create`
DESC
我必须过滤字符串列中的数据,因此需要将使用的列NOT LIKE
与一堆字符串进行比较。
我正在使用 SQL Server,我的代码如下所示:
SELECT history.date,
history.new_value,
res.resource_name
FROM item_history history,
owned_resource res
WHERE (history.attr_name = 'resource_contact' OR history.attr_name = 'Kontakt-UUID')
AND res.inactive = 0
AND history.com_par_id = res.own_resource_uuid
AND lower(history.new_value) NOT LIKE '%tp für%'
AND lower(history.new_value) NOT LIKE '%rücklieferung%'
AND lower(history.new_value) NOT LIKE '%rückläufer%'
AND lower(history.new_value) NOT LIKE '%stoerreserve%'
AND lower(history.new_value) NOT LIKE '%zentrallager%'
AND lower(history.new_value) NOT LIKE '%bhs-pool%'
AND lower(history.new_value) NOT LIKE '%lager halle%'
AND lower(history.new_value) NOT LIKE '%lager logistik%'
AND lower(history.new_value) NOT LIKE 'reserve %'
AND lower(history.new_value) NOT LIKE '%igeko%bhs%'
AND lower(history.new_value) NOT LIKE '%service%ecg%'
AND lower(history.new_value) NOT LIKE '%multifunktionsdrucker%'
AND lower(history.new_value) NOT LIKE 'nn%gisa%raum%'
AND lower(history.new_value) NOT LIKE '%citrix%admins%'
AND lower(history.new_value) NOT LIKE '%personalwesen%'
AND lower(history.new_value) NOT LIKE '%etagendrucker%'
AND lower(history.new_value) NOT LIKE '%schulungsraum%'
AND lower(history.new_value) NOT LIKE '%team%raum%'
AND lower(history.new_value) NOT LIKE '%beratungsraum%'
AND lower(history.new_value) != 'reserve'
)
我猜性能并不是一遍又一遍地调用“lower()”的最佳方法。另外,作为一名程序员,看到这么多冗余代码,我的指甲都卷起来了。不幸的是,我没有找到使用变量或其他东西的好方法。(我想补充一点,我不能简单地添加一个新的计算列,这将是一个好方法,我只被授权读取数据。)
有什么建议可以让代码更智能吗?
我正在尝试CASE WHEN
在 SQL 子句中添加以下语句WHERE
,但 SQL Server 不允许我这样做。使用的所有列都是相同的,Data Types
但仍然给我错误,任何人都可以检查并建议它为什么不起作用?
WHERE supplierAccountDetail.SupplierMasterID IN (
CASE
WHEN @SupplierMasterID IS NOT NULL
THEN @SupplierMasterID
ELSE (sales.ParentSupplierMasterID
,sales.DivisionSupplierMasterID) //Error - Syntax Error
END
)
我想查询我们的CRM Db
. 我有一个备份CRM Db
和现有的。有一个custom entity
,在他们两个我都创建了。我的一些自定义实体记录已从现有数据库中删除。我想比较哪些记录已删除。现有记录数为 17,备份包含 19 条记录。自定义实体名为new_services
。备份数据库被命名test2
,现有一个是MSCRM
表名是new_services
当我查询这个相等的时:
select * from test2.dbo.new_services as t1,
MSCRM.dbo.new_services as t2
where t1.new_service_Id = t2.new_service_Id;
并返回正确的记录,但是当我尝试这个时:
select * from test2.dbo.new_services as t1,
MSCRM.dbo.new_services as t2
where t1.new_service_Id != t2.new_service_Id;
它返回 308 records
!new_service_id 是记录的 guid。哪里错了?
如果我使用以下选择
SELECT * FROM users WHERE id IN (3,1,2)
我可以期望结果与提供的 ID 的顺序相同吗?