我的问题很简单.
是否可以在PostgreSQL中的alter表达式中使用子查询?
我想根据主键列值更改序列值.
我尝试使用以下表达式,但它不会执行.
alter sequence public.sequenceX restart with(从表中选择max(table_id)+1)
提前致谢
我有一个相关的问题,但这是我的谜题的另一部分.
我想从UPDATEd的行中获取列的OLD VALUE - 不使用触发器(也不使用存储过程,也不使用任何其他额外的非SQL /查询实体).
我的查询是这样的:
UPDATE my_table
SET processing_by = our_id_info -- unique to this worker
WHERE trans_nbr IN (
SELECT trans_nbr
FROM my_table
GROUP BY trans_nbr
HAVING COUNT(trans_nbr) > 1
LIMIT our_limit_to_have_single_process_grab
)
RETURNING row_id;
Run Code Online (Sandbox Code Playgroud)
如果我可以在子查询结束时执行"FOR UPDATE ON my_table",那将是devine(并修复我的其他问题/问题).但是,这不起作用:不能有这个AND"GROUP BY"(这对于计算trans_nbr的COUNT是必要的).然后我可以直接使用那些trans_nbr并进行查询以获得(即将成为)之前的processing_by值.
我尝试过这样做:
UPDATE my_table
SET processing_by = our_id_info -- unique to this worker
FROM my_table old_my_table
JOIN (
SELECT trans_nbr
FROM my_table
GROUP BY trans_nbr
HAVING COUNT(trans_nbr) > 1
LIMIT our_limit_to_have_single_process_grab
) sub_my_table
ON old_my_table.trans_nbr = sub_my_table.trans_nbr …Run Code Online (Sandbox Code Playgroud) 我正在编写此查询以查找table1中的重复CTN记录.所以我的想法是,如果CTN_NO出现超过两次或更高,我希望它在我的SELECT*语句输出中显示在顶部.
我尝试了以下子查询逻辑,但我需要拉动
SELECT *
table1
WHERE S_IND='Y'
and CTN_NO = (select CTN_NO
from table1
where S_IND='Y'
and count(CTN_NO) < 2);
order by 2
Run Code Online (Sandbox Code Playgroud) 想象一下以下(简化)数据库布局:

我们有许多"假期"记录,涉及在特定日期前往特定住宿等.
我想从数据库中提取每个住宿的"最佳"假期(即最低价格),给定一组搜索标准(例如持续时间,出发机场等).
将有多个具有相同价格的记录,因此我们需要选择保存(降序),然后按出发日期升序.
我可以写SQL来做这个看起来像这样(我不是说这必然是最优化的方式):
SELECT *
FROM Holiday h1 INNER JOIN (
SELECT h2.HolidayID,
h2.AccommodationID,
ROW_NUMBER() OVER (
PARTITION BY h2.AccommodationID
ORDER BY OfferSaving DESC
) AS RowNum
FROM Holiday h2 INNER JOIN (
SELECT AccommodationID,
MIN(price) as MinPrice
FROM Holiday
WHERE TradeNameID = 58001
/*** Other Criteria Here ***/
GROUP BY AccommodationID
) mp
ON mp.AccommodationID = h2.AccommodationID
AND mp.MinPrice = h2.price
WHERE TradeNameID = 58001
/*** Other Criteria Here ***/
) x on h1.HolidayID = x.HolidayID and …Run Code Online (Sandbox Code Playgroud) 有没有办法从主查询中实时获取列,并在子查询中使用它?
这样的事情:(在子查询中使用A.item)
SELECT item1, *
FROM TableA A
INNER JOIN
(
select *
from TableB B
where A.item = B.item
) on A.x = B.x;
Run Code Online (Sandbox Code Playgroud)
好的,这是真的:
我需要修改这个现有的查询.它以前工作过,但现在数据库发生了变化,我需要做一些修改,添加一些比较.正如您所看到的,有很多JOINS,其中一个是子查询.我需要从一列从主查询(例如从表T0)增加相比,子查询(是这样的:T6.UnionAll_Empresa = T0.UnionALl_Empresa)
Select T0.UnionAll_Empresa,<STUFF>
from [UNION_ALL_BASES]..OINV T0 with (nolock)
inner join [UNION_ALL_BASES]..INV6 T1 with (nolock) on t0.DocEntry = t1.DocEntry and t0.UnionAll_Empresa = t1.UnionAll_Empresa
inner join
(
select
t1.CompanyID,
T2.CompanyDb,
t1.OurNumber,
T6.BankCode,
T6.BankName,
T3.[Description] Situation,
T1.[Status],
T5.Descrption nomeStatus,
T1.Origin,
T1.DocEntry,
T1.DocType,
T1.ControlKey,
T1.CardCode,
T4.[Description] ContractBank,
T1.PayMethodCode,
T1.DueDate,
T1.DocDate,
T1.InstallmentID,
T1.InstallmentValue,
T1.Correction,
T1.InterestContractural, …Run Code Online (Sandbox Code Playgroud) 给定foo具有复合主键的表(a,b),是否存在用于编写查询的合法语法,例如:
SELECT ... FROM foo WHERE a,b IN (SELECT ...many tuples of a/b values...);
UPDATE foo SET ... WHERE a,b IN (SELECT ...many tuples of a/b values...);
Run Code Online (Sandbox Code Playgroud)
如果这是不可能的,并且您无法修改架构,那么如何执行上述等效操作?
我还将在这里为这些别名的搜索命中设置术语"复合主键","子选择","子选择"和"子查询".
编辑:我对标准SQL的答案感兴趣,以及那些适用于PostgreSQL和SQLite 3的答案.
我正在努力重写一些写得不好的SQL查询,他们过度使用子查询.我正在寻找有关子查询使用的最佳实践.
任何帮助,将不胜感激.
我看到很多类似的问题,但它们要么是如此复杂,我无法理解它们,或者它们似乎并没有问同样的问题.
这很简单:我有两列:用户(dmid)和下载(dfid).
选择下载特定文件的所有用户:
SELECT DISTINCT dmid FROM downloads_downloads where dfid = "7024"
Run Code Online (Sandbox Code Playgroud)使用上面的用户,找到他们都下载的所有文件:
SELECT dfid from downloads_downloads WHERE dmid = {user ids from #1 above}
Run Code Online (Sandbox Code Playgroud)计算并订购dfid结果,这样我们就可以看到每个文件收到的下载次数:
dfid dl_count_field
---- --------------
18 103
3 77
903 66
Run Code Online (Sandbox Code Playgroud)我试图回答.
这似乎很接近,但MySql陷入困境,即使在30秒后也没有响应 - 我最终重启了Apache.而且我现在不知道如何在没有语法错误的情况下构造计数和顺序,因为复杂的语句 - 它甚至可能不是正确的语句.
SELECT dfid from downloads_downloads WHERE dmid IN (
SELECT DISTINCT dmid FROM `downloads_downloads` where dfid = "7024")
Run Code Online (Sandbox Code Playgroud) 我有三张桌子:
table "package"
-----------------------------------------------------
package_id int(10) primary key, auto-increment
package_name varchar(255)
price decimal(10,2)
table "zones"
------------------------------------------------------
zone_id varchar(32) primary key (ex of data: A1, Z2, E3, etc)
table "package_zones"
------------------------------------------------------
package_id int(10)
zone_id varchar(32)
Run Code Online (Sandbox Code Playgroud)
我要做的是返回包表中的所有信息PLUS该包的区域列表.我希望区域列表按字母顺序排序并以逗号分隔.
所以我正在寻找的输出是这样的......
+------------+---------------+--------+----------------+
| package_id | package_name | price | zone_list |
+------------+---------------+--------+----------------+
| 1 | Red Package | 50.00 | Z1,Z2,Z3 |
| 2 | Blue Package | 75.00 | A2,D4,Z1,Z2 |
| 3 | Green Package | 100.00 | B4,D1,D2,X1,Z1 |
+------------+---------------+--------+----------------+
Run Code Online (Sandbox Code Playgroud)
我知道我可以在PHP中使用表示层来完成所需的结果.问题是,我希望能够对zone_list ASC或DESC进行排序,甚至使用"WHERE …
这似乎应该相当简单,但我在寻找一个适合我的解决方案时遇到了绊脚石.
我有一个member_contracts表具有以下(简化)结构.
MemberID | ContractID | StartDate | End Date |
------------------------------------------------
1 1 2/1/2002 2/1/2003
2 2 3/1/2002 3/1/2003
3 3 4/1/2002 4/1/2003
1 4 2/1/2002 2/1/2004
2 5 3/1/2003 2/1/2004
3 6 4/1/2003 2/1/2004
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个查询,从该表中选择最近的合同.这是这个小例子的以下输出:
MemberID | ContractID | StartDate | End Date |
------------------------------------------------
1 4 2/1/2002 2/1/2004
2 5 3/1/2003 2/1/2004
3 6 4/1/2003 2/1/2004
Run Code Online (Sandbox Code Playgroud)
基于每个用户执行此操作非常简单,因为我可以使用子查询来为指定用户选择max contractID.我正在使用SQL服务器,所以如果有一种特殊的方式来做这种味道,我愿意使用它.就个人而言,我喜欢与引擎无关的东西.
但是,我将如何编写一个能够实现所有用户目标的查询?
编辑:我还应该补充一点,我正在寻找每个用户的最大contractID值,而不是最近的日期.
subquery ×10
sql ×8
mysql ×2
postgresql ×2
sql-server ×2
alter ×1
concat ×1
field ×1
group-concat ×1
join ×1
list ×1
nhibernate ×1
oracle ×1
queryover ×1
sequence ×1
sql-update ×1