首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接三个表,每个表都包含where子句

连接三个表,每个表都包含where子句
EN

Stack Overflow用户
提问于 2018-07-05 17:19:11
回答 4查看 1.7K关注 0票数 1

我有以下代码:

代码语言:javascript
复制
SELECT KAYTTAJA.ti_ka_kayttajaid as USER_ID, 
       KAYTTAJA.ti_ka_etunimi as USER_NAME, 
       EXAM.ti_su_sitoumusid as SITOUMUS_ID, 
       EXAM.ti_su_nimitys as SITOUMUS_NAME, 
       PVM.ti_sk_paivamaara AS SITOUMUS_DATE
FROM ti_sitoumus_kayttaja PVM
    WHERE PVM.ti_sk_kayttajaid IN (
        SELECT DISTINCT ti_kayttajantyoyksikko.ti_kt_kayttajaid
        FROM ti_kayttajantyoyksikko 
        WHERE ti_kayttajantyoyksikko.ti_kt_tyoyksikko IN(
            SELECT DISTINCT ti_esimiehentyoyksikko.ti_et_tyoyksikkoid
            FROM ti_esimiehentyoyksikko 
            WHERE ti_esimiehentyoyksikko.ti_et_kayttajaid=14784)) 
JOIN ti_kayttaja KAYTTAJA
    WHERE KAYTTAJA.ti_ka_kayttajaid IN (
        SELECT DISTINCT ti_kayttajantyoyksikko.ti_kt_kayttajaid
        FROM ti_kayttajantyoyksikko 
        WHERE ti_kayttajantyoyksikko.ti_kt_tyoyksikko IN(
            SELECT DISTINCT ti_esimiehentyoyksikko.ti_et_tyoyksikkoid
            FROM ti_esimiehentyoyksikko 
            WHERE ti_esimiehentyoyksikko.ti_et_kayttajaid=14784))
ON PVM.ti_sk_kayttajaid(+) = KAYTTAJA.ti_ka_kayttajaid
JOIN FROM ti_sitoumus EXAM
    WHERE EXAM.ti_su_sitoumusid IN (
        SELECT DISTINCT ti_kayttooikeus_ryhma.ti_kr_kayttokohdeid
        FROM ti_kayttooikeus_ryhma 
        WHERE ti_kayttooikeus_ryhma.ti_kr_kayttokohde = 6 
        AND ti_kayttooikeus_ryhma.ti_kr_kohdeid IN (
            SELECT DISTINCT ti_esimiehentyoyksikko.ti_et_tyoyksikkoid
            FROM ti_esimiehentyoyksikko 
            WHERE ti_esimiehentyoyksikko.ti_et_kayttajaid=14784))
ON PVM.ti_sk_sitoumusid = EXAM.ti_su_sitoumusid(+)
ORDER BY KAYTTAJA.ti_ka_kayttajaid;

这会给我一个错误:"SQL命令没有正确结束。“至少first JOIN不起作用,我不知道如何修复它。最终,我试图实现这一点:Using Oracle combine three tables to one with PIVOT,但是当我连接表时,我应该使用某种连接语法。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-07-05 18:44:31

您有三个选项可以将表与WHERE子句联接:

1连接表,并将所有where子句放在末尾(正如@Amir Pashazadeh回答的那样。

代码语言:javascript
复制
SELECT *
 FROM table1 JOIN table2 
WHERE conditions_on_table1
  AND conditions_on_table2 ...

2个连接子查询,包括where条件

代码语言:javascript
复制
SELECT *
 FROM table1
 JOIN (SELECT columns_I_need
        FROM table2
       WHERE conditions_on_table2)
   ON table1.col = table2.col

3使用WITH子句将查询分成更容易理解(和测试)的部分。

对于这样的查询,我通常会使用选项3。您似乎使用了两次表ti_kayttajantyoyksikko和ti_esimiehentyoyksikko,所以我将它们放在一个子查询中:

代码语言:javascript
复制
WITH 
  my_unit AS (
    SELECT t1.ti_kt_kayttajaid AS USER_ID
      FROM ti_kayttajantyoyksikko t1
      JOIN ti_esimiehentyoyksikko t2
        ON t1.ti_kt_tyoyksikko = t2.ti_et_tyoyksikkoid
      WHERE t2.ti_et_kayttajaid = 14794)
SELECT * FROM my_unit;

一旦这达到了我的预期,我将添加下一部分:

代码语言:javascript
复制
WITH 
  my_unit AS (
    SELECT t1.ti_kt_kayttajaid AS USER_ID
      FROM ti_kayttajantyoyksikko t1
      JOIN ti_esimiehentyoyksikko t2
        ON t1.ti_kt_tyoyksikko = t2.ti_et_tyoyksikkoid
      WHERE t2.ti_et_kayttajaid = 14794),
  my_users AS (
    SELECT k.ti_ka_kayttajaid as USER_ID
           k.ti_ka_etunimi    as USER_NAME
      FROM ti_kayttaja k
      JOIN my_unit u ON k.ti_ka_kayttajaid = u.user_id)
SELECT * FROM my_users;

..。然后..。

代码语言:javascript
复制
WITH 
  my_unit AS (
    SELECT t1.ti_kt_kayttajaid AS USER_ID
      FROM ti_kayttajantyoyksikko t1
      JOIN ti_esimiehentyoyksikko t2
        ON t1.ti_kt_tyoyksikko = t2.ti_et_tyoyksikkoid
      WHERE t2.ti_et_kayttajaid = 14794),
  my_users AS (
    SELECT k.ti_ka_kayttajaid as USER_ID
           k.ti_ka_etunimi    as USER_NAME
      FROM ti_kayttaja k
      JOIN my_unit u ON k.ti_ka_kayttajaid = u.user_id)
  my_pvm AS (
    SELECT PVM.PVM.ti_sk_kayttajaid AS USER_ID
           PVM.ti_sk_paivamaara     AS SITOUMUS_DATE
      FROM ti_sitoumus_kayttaja PVM
      JOIN my_unit u ON k.ti_kt_tyoyksikko = u.user_id)
SELECT * 
  FROM      my_users 
  LEFT JOIN my_pvm USING (user_id);

..。最后..。

代码语言:javascript
复制
WITH 
  my_unit AS (
    SELECT t1.ti_kt_kayttajaid AS USER_ID
      FROM ti_kayttajantyoyksikko t1
      JOIN ti_esimiehentyoyksikko t2
        ON t1.ti_kt_tyoyksikko = t2.ti_et_tyoyksikkoid
      WHERE t2.ti_et_kayttajaid = 14794),
  my_users AS (
    SELECT k.ti_ka_kayttajaid as USER_ID
           k.ti_ka_etunimi    as USER_NAME
      FROM ti_kayttaja k
      JOIN my_unit u ON k.ti_ka_kayttajaid = u.user_id)
  my_pvm AS (
    SELECT PVM.PVM.ti_sk_kayttajaid AS USER_ID
           PVM.ti_sk_paivamaara     AS SITOUMUS_DATE,
           PVM.ti_sk_sitoumusid     AS SITOUMUS_ID
      FROM ti_sitoumus_kayttaja PVM
      JOIN my_unit u ON k.ti_kt_tyoyksikko = u.user_id),
  my_exam AS (
    SELECT EXAM.ti_su_sitoumusid as SITOUMUS_ID, 
           EXAM.ti_su_nimitys    as SITOUMUS_NAME
      FROM ti_sitoumus EXAM
     WHERE EXISTS (
             SELECT *
               FROM ti_kayttooikeus_ryhma t3
               JOIN ti_esimiehentyoyksikko t4
                 ON t3.ti_kr_kohdeid = t4.ti_et_tyoyksikkoid
              WHERE t3.ti_kr_kayttokohde = 6
                AND t4.ti_et_kayttajaid = 14784
                AND EXAM.ti_su_sitoumusid = t3.ti_kr_kayttokohdeid))
SELECT user_id, user_name, sitoumus_id, sitoumus_name, sitoumus_date
  FROM my_users 
  LEFT JOIN my_pvm  USING (user_id)
  LEFT JOIN my_exam USING (sitoumus_id)
 ORDER BY user_id;
票数 3
EN

Stack Overflow用户

发布于 2018-07-05 18:02:15

将所有where子句移到查询的末尾,这样它将类似于

代码语言:javascript
复制
SELECT KAYTTAJA.ti_ka_kayttajaid as USER_ID, KAYTTAJA.ti_ka_etunimi as USER_NAME, EXAM.ti_su_sitoumusid as SITOUMUS_ID, EXAM.ti_su_nimitys as SITOUMUS_NAME, PVM.ti_sk_paivamaara AS SITOUMUS_DATE
FROM ti_sitoumus_kayttaja PVM
left JOIN ti_kayttaja KAYTTAJA ON PVM.ti_sk_kayttajaid = KAYTTAJA.ti_ka_kayttajaid
left JOIN FROM ti_sitoumus EXAM ON PVM.ti_sk_sitoumusid = EXAM.ti_su_sitoumusid

WHERE PVM.ti_sk_kayttajaid IN (
    SELECT DISTINCT ti_kayttajantyoyksikko.ti_kt_kayttajaid
    FROM ti_kayttajantyoyksikko 
    WHERE ti_kayttajantyoyksikko.ti_kt_tyoyksikko IN(
        SELECT DISTINCT ti_esimiehentyoyksikko.ti_et_tyoyksikkoid
        FROM ti_esimiehentyoyksikko 
        WHERE ti_esimiehentyoyksikko.ti_et_kayttajaid=14784)) 

and KAYTTAJA.ti_ka_kayttajaid IN (
    SELECT DISTINCT ti_kayttajantyoyksikko.ti_kt_kayttajaid
    FROM ti_kayttajantyoyksikko 
    WHERE ti_kayttajantyoyksikko.ti_kt_tyoyksikko IN(
        SELECT DISTINCT ti_esimiehentyoyksikko.ti_et_tyoyksikkoid
        FROM ti_esimiehentyoyksikko 
        WHERE ti_esimiehentyoyksikko.ti_et_kayttajaid=14784))


and EXAM.ti_su_sitoumusid IN (
    SELECT DISTINCT ti_kayttooikeus_ryhma.ti_kr_kayttokohdeid
    FROM ti_kayttooikeus_ryhma 
    WHERE ti_kayttooikeus_ryhma.ti_kr_kayttokohde = 6 
    AND ti_kayttooikeus_ryhma.ti_kr_kohdeid IN (
        SELECT DISTINCT ti_esimiehentyoyksikko.ti_et_tyoyksikkoid
        FROM ti_esimiehentyoyksikko 
        WHERE ti_esimiehentyoyksikko.ti_et_kayttajaid=14784))

ORDER BY KAYTTAJA.ti_ka_kayttajaid;

顺便说一句,你不能在ANSI JOINS中使用(+),如果你想使用ANSI JOINS,请使用LEFT JOINRIGHT JOIN而不是(+)

票数 1
EN

Stack Overflow用户

发布于 2018-07-05 17:57:09

查询中的许多问题。您需要:

代码语言:javascript
复制
SELECT
FROM table1, table2, table3   -- since you're using (+)
WHERE table2.joinKeyTable1 (+) = table1.joinKeyTable2
AND   table3.joinKeyTable1 (+) = table1.joinKeyTable3
AND <all filters>

注意:由于它是一个外连接-正如您似乎所要求的,您需要在table2的任何列旁边使用(+),并在所有筛选器中使用table3 :示例:

代码语言:javascript
复制
AND table2.columnX (+) IN (...)

或者

代码语言:javascript
复制
AND table3.columnY (+) = ...

这将检索在table2或table3中没有相应(childs)的所有table1记录,而不管您在相应的table2/table3列上使用了什么过滤器

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51187646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档