我想找到每个条目最上面的父 ID。例如,
CREATE TABLE t1
(
ID int(11) unsigned NOT NULL,
ParentID int(11) unsigned,
PRIMARY KEY (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
INSERT INTO t1 (ID,ParentID) VALUES (1,NULL),(2,1),(3,2),(4,3);
Run Code Online (Sandbox Code Playgroud)
我意图得到
ID Highest ParentID
1 NULL
2 1
3 1
4 1
Run Code Online (Sandbox Code Playgroud)
我计划创建一个递归查询(MySQL 8 或 MariaDB 10.5),方法是添加一个条件,以在 Parent ID 为特定值(例如,上述情况下为 NULL)时中断递归。我开始于
WITH RECURSIVE cte (ID, ParentID) as (
SELECT ID,ParentID FROM t1
UNION ALL
SELECT t2.ID,t2.ParentID FROM t1 t2
INNER JOIN cte on t2.ParentID = cte.ID
)
SELECT * FROM cte; …Run Code Online (Sandbox Code Playgroud) 我有一个包含以下结构和数据的表:
create table TEST_TABLE
(
item_number NUMBER,
item_name VARCHAR2(50),
item_col VARCHAR2(50),
item_pol VARCHAR2(50)
)
Run Code Online (Sandbox Code Playgroud)
样本数据:
item_number | item_name| item_col | item_pol
------------------------------------------------
1 | blue | b | c
2 | red | d | a
3 | black | e | a
4 | yellow | d | b
Run Code Online (Sandbox Code Playgroud)
这是我尝试使用的示例过程bind variables。
create or replace procedure test_bind_variable(res out sys_refcursor,
item_number varchar2,
item_name varchar2,
item_col varchar2,
item_pol varchar2) is
qry varchar2(8000);
begin
qry := 'select * from test_table where …Run Code Online (Sandbox Code Playgroud) 我在使用内部联接从两个表中获取唯一值时遇到问题。
\nSELECT distinct cast (opd.order_number as integer), p.payment_id ,\n pt.transaction_status, \n opd.installments_number, \n pt.amount, \n pt.origin_amount,\n p.payment_capture_type,\n opd.brand,\n pt.created_date, \n d."name" \nFROM payment p \nINNER JOIN payment_transaction pt ON pt.payment_id = p.payment_id\ninner join "domain" d on d.domain_id = p.domain_id \nINNER JOIN attempted_online_payment_data opd ON p.payment_id = CAST ( opd.order_number AS INTEGER )\nWHERE \np.created_date >= \'2021-11-01\' and status = 1\nRun Code Online (Sandbox Code Playgroud)\n这是我正在使用的查询,我想要一个 payment_id\xc2\xb4s 的唯一值列表,但是当我这样做时,由于某种原因它会带来两个相同的 payment_id。
\n\n如何为每个 payment_id 获取唯一的行?
\n我有一个"customer_config"包含这些列的表:
company (varchar)
warehouse (numeric)
section (numeric)
config_keyword (varchar)
config_value (varchar)
Run Code Online (Sandbox Code Playgroud)
这两config_*列可以应用于整个公司(warehouse和section为空)、公司内的整个仓库(section为空)或仓库内的一个部分。
因此,我们可以为公司设置一个默认行,然后使用一个或多个行来覆盖特定仓库或仓库和部分的配置值。
我只想返回给定公司、仓库和部门的最具体的行。像这样的伪代码:
results = select * from customer_config where (all match)
if results empty
results = select * from customer_config where (company_code and warehouse match)
if results empty
results = select * from customer_config where (company_code matches)
Run Code Online (Sandbox Code Playgroud)
最具体的行应优先。
同一级别上可以有多个相同的条目config_keyword。
是否也可以为单个关键字返回多行?
我有2张桌子
| ID | 指定 |
|---|---|
| 1 | 古柯 |
| 2 | 百事可乐 |
| 3 | 芬达 |
| 4 | 七 |
| 5 | 八 |
2)子产品
| 产品编号 | 姓名 | 数量 |
|---|---|---|
| 1 | SM | 10 |
| 1 | lg | 10 |
| 1 | XL | 20 |
| 2 | 1升 | 10 |
| 2 | 2升 | 20 |
| 2 | 5升 | 20 |
| 3 | 泰 | 10 |
| 3 | 萨 | 20 |
| 4 | 哈 | 20 |
| 4 | 克德 | 30 |
我想要的是这样的:产品表中的指定和总数量,代表具有相同product_id的数量的总和
| 指定 | 总数(量 |
|---|---|
| 古柯 | 40 |
| 百事可乐 | 50 |
| 芬达 | 30 |
| 七 | 50 |
注:我使用 SQL 服务器
想象一下我有一个看起来像这样的结果集:
+----+------------+------------+
| Id | Date_One | Date_Two |
+----+------------+------------+
| 1 | 2022-05-12 | null |
| 2 | 2022-05-13 | 2022-05-11 |
| 3 | null | 2022-05-14 |
+----+------------+------------+
Run Code Online (Sandbox Code Playgroud)
我想首先根据最早的日期对结果进行排序,而不考虑列。每行将有一个Date_One或Date_Two填充。它们永远不会都为空。
因此上述结果集的结果将是:
+----+------------+------------+
| Id | Date_One | Date_Two |
+----+------------+------------+
| 2 | 2022-05-13 | 2022-05-11 |
| 1 | 2022-05-12 | null |
| 3 | null | 2022-05-14 |
+----+------------+------------+
Run Code Online (Sandbox Code Playgroud)
(因为 Id 2Date_Two早于 Id 1 Date_One)。
我不确定如何创建我的ORDER …
有一个包含 25.000.000 个条目的表,我有以下查询,该查询每 2 秒启动一次,这会导致非常高的负载(在 Amazon AWS 中高达 40 AAS)。执行时间需要20秒到5分钟,甚至会导致用户浏览器超时,掉线率很高。
SELECT COUNT ( * ) AS `chk`
FROM ( SELECT `item_id`
FROM `items`
WHERE `item_status` IN (...)
AND `item_type` = ?
AND `user_id` != ?
AND `item_name` IN (...)
LIMIT 3
) AS OTHERS
;
Run Code Online (Sandbox Code Playgroud)
索引优化已完成 - 、、 和user_id均已item_name建立索引(每列一个索引)。item_typeitem_status
更多信息:
varchar128请注意,在大约 50% 的情况下,MySQL 必须检查完整的表,因为找到的项目少于 3 个。因此,该限制仅在商品数量超过 3 件的情况下才有用。 …
假设我有一张桌子Entry。在查询期间WITH替换表的子句是否有效?Entry我尝试使用 SQLite 和 MySql,它似乎可以工作,但我想在应用程序中使用它之前确定这是有意的。
让我添加一些细节。假设我有一个表Entry和另一个表Thing,以及这样的查询
SELECT Entry.k, Entry.v, Thing.v2
FROM Entry INNER JOIN Thing ON Entry.v = Thing.k
Run Code Online (Sandbox Code Playgroud)
以下内容有效吗?
WITH Entry AS (SELECT 1 AS k, 1234 AS v)
SELECT Entry.k, Entry.v, Thing.v2
FROM Entry INNER JOIN Thing ON Entry.v = Thing.k
Run Code Online (Sandbox Code Playgroud)
这似乎符合我的要求,但是我可以指望这种行为不是错误或未定义的行为吗?在 SQLite 或 MySQL 的文档中找不到任何明确允许或禁止它的内容。
(我知道在这个特定的例子中我可以SELECT ... FROM Thing WHERE ...。这不是这个问题的重点 - 请相信我,我有充分的理由编写我正在编写的查询:))
我有以下查询,我正在查找该列不等于 1 的任何行istrue。但结果只包含 0 的记录,忽略 null 的记录。虽然我知道使用(istrue != 1 or istrue is null)会产生预期的结果,但我很好奇导致 SQL Server 排除 null 值的底层机制。您能否提供对此行为的见解?谢谢!
create table #test
(
id int,
val varchar(100),
istrue bit
)
insert into #test values
(1, 'test-1', 1),
(2, 'test-2', 0),
(3, 'test-3', 1),
(4, 'test-4', 0),
(5, 'test-5', null),
(6, 'test-6', null)
select * from #test
where istrue != 1
drop table if exists #test
Run Code Online (Sandbox Code Playgroud) 我正在编写一个 Drupal 模块,我希望它在 PostgreSQL 和 MySQL 之间是不可知的。我有一个从条件中获取其值的字段,我最初将它写为IF(). 然后我发现这IF()是一个 MySQL 主义。所以,我查找了 PostgreSQL 的条件语句,CASE似乎是最好的工具。
但是,我注意到以 PostgreSQLCASE结尾END,而在MySQL 中以END CASE. 这会破坏我对数据库不可知论的希望吗?我可以用条件编写一个不可知的查询吗?
query ×10
mysql ×4
postgresql ×4
join ×3
sql-server ×2
cte ×1
distinct ×1
group-by ×1
index ×1
null ×1
oracle ×1
order-by ×1
performance ×1
plsql ×1
precedence ×1
recursive ×1
select ×1
sqlite ×1
sum ×1