标签: correlated-subquery

错误:FROM中的子查询不能引用相同查询级别的其他关系

我正在使用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

4
推荐指数
1
解决办法
8636
查看次数

我可以从子查询中获取逗号分隔值吗?如果没有,如何完成这项工作?

我有一张桌子

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)

但没有奏效......

t-sql sql-server correlated-subquery

4
推荐指数
1
解决办法
7140
查看次数

如何在 Oracle 相关子查询连接中使用别名?

我正在使用子查询进行连接操作。当我对参数进行硬编码时,一切正常。但这些参数必须来自外部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条款的。此类子查询中的别名合法吗?

oracle correlated-subquery

4
推荐指数
1
解决办法
6051
查看次数

左连接中的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)

sql t-sql sql-server-2008 correlated-subquery

3
推荐指数
1
解决办法
2224
查看次数

Oracle相关UPDATE

我对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)

这实际上是运行子查询两次吗?是否有比此更简短的语法?

sql sql-server plsql oracle10g correlated-subquery

3
推荐指数
1
解决办法
5057
查看次数

MYSql - 在Zend Db中使用相关子查询

我正在尝试使用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 …

mysql zend-framework zend-db correlated-subquery

3
推荐指数
1
解决办法
970
查看次数

使用来自 self 的值更新 PostgreSQL 表

我正在尝试使用同一表中另一行的值更新表中的多个列

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

3
推荐指数
1
解决办法
6039
查看次数

子查询中出现意外行为

我有一个看起来像这样的查询:

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 oracle correlated-subquery

3
推荐指数
1
解决办法
184
查看次数

基于ID匹配IN db2从一个表到另一个表的SQL更新

下面的查询适用于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查询的差异.

db2 correlated-subquery sql-update db2-luw

3
推荐指数
2
解决办法
1万
查看次数

如何在没有子查询的情况下找到最大值

为了获得以下结果集,我编​​写了以下 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 t-sql sql-server left-join correlated-subquery

3
推荐指数
1
解决办法
1997
查看次数