我要求在查询中不使用#tempTables,因为将来我们将无法对预期的数据库进行写访问。所以我用 CTE 替换了 #tempTables。但我仍然怀疑在这种情况下它是否有效。
那么您能否告诉我,CTE 是否需要对数据库进行写访问?
我的 SQL 查询有问题。我这里有两个 SQL Server 表。
第一个:
CREATE TABLE [category].[Categories](
[Id] [bigint] IDENTITY(1,1) NOT NULL, -- PRIMARY KEY
[Name] [nvarchar](200) NOT NULL,
[ParentId] [bigint] NULL -- CONSTRAINT [FK_Categories_Categories] FOREIGN KEY([ParentId])
);
Run Code Online (Sandbox Code Playgroud)
第二个是:
CREATE TABLE [product].[Products](
[Id] [bigint] IDENTITY(1,1) NOT NULL, -- PRIMARY KEY
[Name] [nvarchar](250) NOT NULL,
[CategoryId] [bigint] NOT NULL, -- CONSTRAINT [FK_Products_Categories] FOREIGN KEY([CategoryId])
[Description] [nvarchar](500) NULL,
[ManufacturerUrl] [nvarchar](1000) NULL,
[ImageUrl] [nvarchar](1000) NULL,
[Price] [money] NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
假设有一个类别层次结构:
我们目前正在对返回一系列数据的报告进行查询。客户已指定他们希望总共接收 5 行,其中包含前 5 天的数据(由开始日期和结束日期变量定义)。对于每一天,他们都需要最接近凌晨 4 点的行中的数据。
我设法让它工作了一天,但我当然不想联合 5 个单独的 select 语句只是为了获取这些值。有没有办法通过 CTE 来实现这一点?
select top 1
'W' as [RecordType]
, [WellIdentifier] as [ProductionPtID]
, t.Name as [Device Name]
, t.RecordDate --convert(varchar, t.RecordDate, 112) as [RecordDate]
, TubingPressure as [Tubing Pressure]
, CasingPressure as [Casing Pressure]
from #tTempData t
Where cast (t.recorddate as time) = '04:00:00.000'
or datediff (hh,'04:00:00.000',cast (t.recorddate as time)) < -1.2
order by Name, RecordDate desc
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建查询中维度表,我想稍后在数据拉取中使用该表。在 MS SQL 中,我可以摆脱这个 CTE,它将使用值作为表:
with tbl_test_values as (select * from (
VALUES
('Number','1','One'),
('Number','5','Five'),
('Letter','A','First Letter'),
('Human','Bob','Dude')
) as
TestValues --equivalent of table name
(Name, Value, Descript) --essentially field names
)
select * from actual_data_table f
left outer join tbl_test_values d on f.Name=d.Name
Run Code Online (Sandbox Code Playgroud)
有没有办法在 Hive 中复制上述 CTE“tbl_test_values”,即将自定义值集作为表查询?
谢谢
我有一个 CTE 与防御如下
;With Paths as (
select s.ID as RootID,t.subject_ID,t.Parent_ID ,t.text, CONVERT(nvarchar(max),t.text) as Path,convert(nvarchar(max),t.subject_ID) as P2
from
@search s
inner join
SubjectHierarchy t
on
s.ID = t.subject_ID
union all
select p.RootID,t.subject_ID,t.Parent_ID,p.text, t.text + '$' + p.Path,convert(nvarchar(10),t.subject_ID) + '$' + convert(nvarchar(10),p.P2)
from Paths p
inner join
SubjectHierarchy t
on
p.Parent_ID = t.subject_ID
)
Run Code Online (Sandbox Code Playgroud)
但它一直在说错误
Msg 240, Level 16, State 1, Procedure f_fetchKeywordVocabullary, Line 30 类型在递归查询“路径”的“P2”列中的锚点和递归部分之间不匹配。
我的转换有什么问题??
我有一个这样的存储过程:
CREATE PROCEDURE prtl_usp_portal_logdaily
@startdate DATETIME,
@enddate DATETIME,
@usertype int,
@gradelist varchar(1000) = null
AS
BEGIN
DECLARE @qry NVARCHAR(MAX)
SET @qry=''
IF(@usertype = 1)
BEGIN
;WITH mycte AS
(
SELECT CAST(@startdate AS DATETIME) DateValue
UNION ALL
SELECT DateValue + 1
FROM mycte
WHERE DateValue + 1 <= @enddate
)
SET @qry = N'SELECT datepart(day,DateValue) AS daycode,
(select count(DISTINCT a.userID) from PRTL_UserAccessLog a
inner join prtlv_familydetails b
on a.userid=b.familyid
INNER JOIN STD_StudentDetails c ON b.FamilyID = c.familyid
INNER JOIN dbo.STD_CurrentAcademicInformation d …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 SQLAlchemy 中实现一个 CTE,它从父/子树中的给定节点返回一个根节点。
我能够按照递归 CTE 查询中的示例在 SQLAlchemy 中生成 CTE 递归。
但我不确定如何在其上附加附加条件。即:
WITH ...
SELECT parent_id from parents
WHERE parent_id NOT IN (SELECT child_id FROM node_parent_relation );
Run Code Online (Sandbox Code Playgroud)
我想这样做,以便我只返回根节点。
查询在 SQL 中工作。
WITH RECURSIVE parents( child_id, parent_id )
AS (
-- get leaf children
SELECT child_id, parent_id
FROM node_parent_relation
WHERE child_id = '4415b581-0a31-43e8-a69d-d74caeccacd2'
UNION ALL
-- get all parents
SELECT t.child_id, t.parent_id
FROM parents p
JOIN node_parent_relation t
ON p.parent_id = t.child_id
)
SELECT parent_id from parents
WHERE parent_id …Run Code Online (Sandbox Code Playgroud) 我有一个Postgres表users(E_8_User),其中包含User_id作为主键,Boss作为同一个表的外键(它不可为空,如果某些用户没有boss,则其Boss属性= user_id)。我需要为表中的所有用户获取他们的老板,所以我尝试编写 CTE 查询:
WITH RECURSIVE herarchy_reports AS (
SELECT E_8_User.User_id, E_8_User.Boss, 1 as lvl, E_8_User.User_id as RootUserID
FROM E_8_User
WHERE E_8_User.User_id=E_8_User.Boss
UNION ALL
SELECT usr.User_id, usr.Boss, lvl+1 as lvl, rep.RootUserID
FROM herarchy_reports as rep JOIN E_8_User as usr ON
rep.user_id=usr.Boss
)
SELECT * FROM herarchy_reports ORDER BY RootUserID;
Run Code Online (Sandbox Code Playgroud)
但它不起作用:数据库不断执行查询。我究竟做错了什么?
sql postgresql recursive-query common-table-expression hierarchical-data
我在 MS SQL Server 中有下表:
RowID PersonNum Address1
1 456 1 My street
2 NULL 1 My street
3 789 1 My street
4 987 2 My street
5 963 2 My street
6 852 3 My street
7 741 3 My street
8 NULL 3 My street
Run Code Online (Sandbox Code Playgroud)
我想删除同一地址中的所有行,其中至少有一个 personnum = NULL
所以从上面,我需要删除 RowID 的 1、2、3、6、7、8。
RowID 的 4 和 5 没问题,因为它们有一个 PersonNum。我如何在 T SQL 中实现这一点?这可以使用 CTE 吗?
我无法理解为什么CTE不能从WHERE子句中引用 a 。在下面的代码中,第一个查询工作正常,但在第二个查询中,只需用WHERE计算该值的 CTE替换子句中的值,就会产生错误“'where 子句'中的未知列'cte'”。
# This query works
SELECT * FROM stock_prices
WHERE Country_Exchange_Code = 'T' AND Stock_Code IN ('1332');
# But this query produces an error
WITH
cte AS (SELECT '1332')
SELECT * FROM stock_prices
WHERE Country_Exchange_Code = 'T' AND Stock_Code IN (cte);
# Here is some data to test these two queries with
CREATE TABLE stock_prices (Country_Exchange_Code VARCHAR(2), Stock_Code VARCHAR(4), Date DATE, Close FLOAT);
INSERT INTO stock_prices VALUES
("T", "1301", '2019-10-29', …Run Code Online (Sandbox Code Playgroud) sql ×7
sql-server ×6
hadoop ×1
hive ×1
mysql ×1
oracle ×1
postgresql ×1
python ×1
sql-delete ×1
sqlalchemy ×1
t-sql ×1
where-clause ×1