我正在使用PostgreSQL 9,我想在RP所有元组中查找表中最近的邻居RQ,比较日期(t),但是我得到了这个错误:
错误:FROM中的子查询不能引用相同查询级别的其他关系
使用此查询:
SELECT *
FROM RQ, (SELECT * FROM RP ORDER BY ABS(RP.t - RQ.t) LIMIT 1) AS RA
Run Code Online (Sandbox Code Playgroud)
RQ.t在子查询中似乎是问题所在.我怎样才能避免这个错误?如何从子查询访问RQ?
sql postgresql subquery nearest-neighbor correlated-subquery
我有一张桌子
Create table Country_State_Mapping
(
Country nvarchar(max),
State nvarchar(max)
)
Run Code Online (Sandbox Code Playgroud)
有5条记录.
Insert into Country_State_Mapping values('INDIA', 'Maharastra')
Insert into Country_State_Mapping values('INDIA', 'Bengal')
Insert into Country_State_Mapping values('INDIA', 'Karnatak')
Insert into Country_State_Mapping values('USA', 'Alaska')
Insert into Country_State_Mapping values('USA', 'California')
Run Code Online (Sandbox Code Playgroud)
我需要编写一个SQL查询,它将给我2条记录/ 2列,如下所示.
第1列Contry和第二列AllStates
1条记录(2列)
印度和马哈拉施特拉,孟加拉,卡纳塔克
第2
美国和加利福尼亚州的阿拉斯加州
我试过我喜欢这个
select distinct
OutTable.Country,
(select State
from Country_State_Mapping InnerTable
where InnerTable.Country = OutTable.Country)
from Country_State_Mapping AS OutTable
Run Code Online (Sandbox Code Playgroud)
但没有奏效......
我正在使用子查询进行连接操作。当我对参数进行硬编码时,一切正常。但这些参数必须来自外部sql,我认为这被称为相关查询。我想使用表别名传递它们,但这会导致invalid identifier.
出于问题目的而发明的示例:
SELECT
PR.PROVINCE_NAME
,CO.COUNTRY_NAME
FROM
PROVINCE PR
JOIN (
SELECT COUNTRY_ID, COUNTRY_NAME
FROM COUNTRY
WHERE COUNTRY_ID=PR.COUNTRY_ID
) CO ON CO.COUNTRY_ID=PR.COUNTRY_ID
WHERE
PR.PROVINCE_ID IN (1,2)
Run Code Online (Sandbox Code Playgroud)
这是输入的,所以我希望我没有在这里引入任何语法问题。这个问题具体是关于COUNTRY_ID=PR.COUNTRY_ID遵循该WHERE条款的。此类子查询中的别名合法吗?
这是查询:
SELECT c.Name As CompanyName, j.ID as JobID, j.Title as JobTitle,
ja.ApplicationDate, DATEDIFF(MONTH,ja.ApplicationDate, GETDATE()) AS MonthsAgo,
jsc.Name As Recruiter, js.Name As RecruitingAgency, jsh.Name As LastStatus
FROM Companies c
JOIN Jobs j
ON c.ID = j.CompanyID
JOIN JobApplications ja
ON j.ID = ja.JobID
LEFT JOIN JobContact jsc
ON jsc.ID = j.JobSourceContactID
LEFT JOIN JobContactCompany js
ON jsc.JobSourceCompanyID = js.ID
LEFT JOIN (
SELECT TOP 1 jh.JobID, jh.StatusDate, jt.Name
FROM JobStatusHistory jh
JOIN JobStatusTypes jt
ON jh.JobStatusTypeID = jt.ID
--WHERE jh.JobID = …Run Code Online (Sandbox Code Playgroud) 我对Oracle 10g语法的相关UPDATE有困难.我正在PL/SQL过程中处理此代码.
我会在SQL Server中解决问题:
UPDATE table_a a
SET a.prov_id=pn.prov_id,
a.step=1
from (
SELECT p.prov_id
FROM note n
INNER JOIN provider p ON n.author_id=p.user_id
where n.enc_id=a.enc_id
AND TRUNC(n.note_time)=a.attr_date
) pn
Run Code Online (Sandbox Code Playgroud)
等效的Oracle语法是:
UPDATE table_a a
SET a.prov_id=(
SELECT p.prov_id
FROM note n
INNER JOIN provider p ON n.author_id=p.user_id
where n.enc_id=a.enc_id
AND TRUNC(n.note_time)=a.attr_date
),
a.step=1
WHERE EXISTS (
SELECT *
FROM note n
INNER JOIN provider p ON n.author_id=p.user_id
where n.enc_id=a.enc_id
AND TRUNC(n.note_time)=a.attr_date
)
Run Code Online (Sandbox Code Playgroud)
这实际上是运行子查询两次吗?是否有比此更简短的语法?
我正在尝试使用zend_db_select(ZF 1.12)中的相关子查询构造一个有效的MySql查询,以便在Zend_Paginator_Adapter中使用它.工作查询如下:
SELECT f.*, (SELECT (COUNT(p.post_id) - 1)
FROM `forum_topic_posts` AS p WHERE f.topic_id = p.topic_id) AS post_count
FROM `forum_topics` AS f WHERE f.forum_id = '2293'
ORDER BY post_count DESC, last_update DESC
Run Code Online (Sandbox Code Playgroud)
所以我解决了:
$subquery = $db->select()
->from(array('p' => 'forum_topic_posts'), 'COUNT(*)')
->where('p.topic_id = f.topic_id');
$this->sql = $db->select()
->from(array('f' => 'forum_topics'), array('*', $subquery . ' as post_count'))
->where('forum_id=?', $forumId, Zend_Db::PARAM_INT)
->order('post_count ' . $orderDirection);
Run Code Online (Sandbox Code Playgroud)
但Zend在执行查询时会因以下异常而停止:
Zend_Db_Statement_Mysqli_Exception: Mysqli prepare error: You have an error in your SQL syntax; check the manual that corresponds …
我正在尝试使用同一表中另一行的值更新表中的多个列:
CREATE TEMP TABLE person (
pid INT
,name VARCHAR(40)
,dob DATE
,younger_sibling_name VARCHAR(40)
,younger_sibling_dob DATE
);
INSERT INTO person VALUES (pid, name, dob)
(1, 'John', '1980-01-05'),
(2, 'Jimmy', '1975-04-25'),
(3, 'Sarah', '2004-02-10'),
(4, 'Frank', '1934-12-12');
Run Code Online (Sandbox Code Playgroud)
任务是来填充younger_sibling_name,并younger_sibling_dob用最接近他们年龄的人的姓名和出生的日子,但不是旧的或相同的年龄。
我可以dob轻松设置弟弟妹妹,因为这是确定要与相关子查询一起使用的记录的值(我认为这是一个例子?):
UPDATE person SET younger_sibling_dob=(
SELECT MAX(dob)
FROM person AS sibling
WHERE sibling.dob < person.dob);
Run Code Online (Sandbox Code Playgroud)
我只是看不到任何方法来获得name? 对于每个 MAX 选择
,实际查询将运行大约100 万条记录,每组 100-500 条,因此性能是一个问题。
编辑:
在尝试了许多不同的方法后,我决定采用这种方法,我认为它可以很好地平衡能够用中间结果验证数据,显示逻辑的意图,并充分执行:
WITH sibling AS ( …Run Code Online (Sandbox Code Playgroud) sql postgresql correlated-subquery window-functions sql-update
我有一个看起来像这样的查询:
SELECT 'FY2000' AS FY, COUNT(DISTINCT SGBSTDN_PIDM) AS CHEM_MAJORS
FROM SATURN.SGBSTDN, SATURN.SFRSTCR
WHERE SGBSTDN_PIDM = SFRSTCR_PIDM
AND SGBSTDN_TERM_CODE_EFF = (SELECT MAX(SGBSTDN_TERM_CODE_EFF)
FROM SATURN.SGBSTDN
WHERE SGBSTDN_TERM_CODE_EFF <= '200002'
AND SGBSTDN_PIDM = SFRSTCR_PIDM)
AND SGBSTDN_MAJR_CODE_1 = 'CHEM'
AND SFRSTCR_TERM_CODE BETWEEN '199905' AND '200002'
AND (SFRSTCR_RSTS_CODE LIKE 'R%' OR SFRSTCR_RSTS_CODE LIKE 'W%')
AND SFRSTCR_CREDIT_HR >= 1
Run Code Online (Sandbox Code Playgroud)
它返回48的计数,我认为是正确的.但是,我不明白为什么SATURN.SFRSTCR子句在FROM子句中不需要引用SFRSTCR_PIDM.我认为子查询是自包含的,无法看到查询的其余部分?
但是,如果我将SATURN.SFRSTCR添加到子查询中,则计数更改为22.如果我取出AND SGBSTDN_PIDM = SFRSTCR_PIDM子查询,计数也会更改为22.有人可以向我解释这个吗?
下面的查询适用于SQL sErver.但在DB2中它没有给出结果:
Error is SQLCODE = -199, ERROR: ILLEGAL USE OF KEYWORD FROM.
Run Code Online (Sandbox Code Playgroud)
查询:
UPDATE
Sales_Import
SET
Sales_Import.AccountNumber = RAN.AccountNumber
FROM
Sales_Import SI
INNER JOIN
RetrieveAccountNumber RAN
ON
SI.LeadID = RAN.LeadID
Run Code Online (Sandbox Code Playgroud)
有人可以澄清b/w DB2和SQL查询的差异.
为了获得以下结果集,我编写了以下 SQL:
SELECT t1.FilmName,
t2.CountryName,
t1.FilmRunTimeMinutes
FROM Film as t1
INNER JOIN country as t2 on t1.FilmCountryId = t2.CountryID
WHERE t1.FilmRunTimeMinutes = ( SELECT max(t2.FilmRunTimeMinutes)
FROM film as t2
WHERE t2.FilmCountryId = t1.FilmCountryId
)
ORDER BY FilmRunTimeMinutes DESC
Run Code Online (Sandbox Code Playgroud)
我阅读了此链接并尝试了相同的方法,但我做不到。那么如何使用 by 获得相同的结果集LEFT OUTER JOIN?
电影表有这些列:
电影 ID --PK 影片名称 电影国家 ID --FK 电影运行时间
Country表有这些列:
CountryId --PK 国家的名字
提前致谢。
sql ×6
sql-server ×3
t-sql ×3
oracle ×2
postgresql ×2
sql-update ×2
db2 ×1
db2-luw ×1
left-join ×1
mysql ×1
oracle10g ×1
plsql ×1
subquery ×1
zend-db ×1