Sql 连接三个表,每个表包含where子句
我有以下代码:Sql 连接三个表,每个表包含where子句,sql,oracle,join,Sql,Oracle,Join,我有以下代码: 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_sitoumu
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不起作用,我不知道如何修复它。最终,我试图做到这一点:但在连接表时,我应该使用某种连接语法。您的查询中存在许多问题。您需要:
SELECT
FROM table1, table2, table3 -- since you're using (+)
WHERE table2.joinKeyTable1 (+) = table1.joinKeyTable2
AND table3.joinKeyTable1 (+) = table1.joinKeyTable3
AND <all filters>
或
这将检索表1中的所有记录,这些记录在表2中或表3中没有相应的child,而不管您在相应的表2/表3列上有哪些筛选器,查询中存在许多问题。您需要:
SELECT
FROM table1, table2, table3 -- since you're using (+)
WHERE table2.joinKeyTable1 (+) = table1.joinKeyTable2
AND table3.joinKeyTable1 (+) = table1.joinKeyTable3
AND <all filters>
或
这将检索table1的所有记录,这些记录在table2或table3中没有相应的child,而不管您在相应的table2/table3列上有哪些筛选器,都会将所有where子句移动到查询的末尾,因此类似于
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连接一起使用,如果您想使用ANSI连接,请使用左连接和右连接,而不是+。将所有where子句移动到查询的末尾,这样类似于
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联接一起使用,如果要使用ANSI联接,请使用左联接和右联接,而不是+。您有三个选项可以使用WHERE子句联接表: 1将表格连接起来,并将所有where子句放在@Amir Pashazadeh回答的末尾
SELECT *
FROM table1 JOIN table2
WHERE conditions_on_table1
AND conditions_on_table2 ...
2连接子查询,包括where条件
SELECT *
FROM table1
JOIN (SELECT columns_I_need
FROM table2
WHERE conditions_on_table2)
ON table1.col = table2.col
3使用WITH子句将查询切分为易于理解和测试的位
对于这种查询,我通常使用选项3。您似乎使用了ti_Kaytajantyoyksikko表和ti_esimiehentyoyksikko表两次,所以我将它们放在子查询中:
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;
一旦达到预期效果,我将添加下一部分:
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;
。。。然后
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);
。。。最后
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;
您有三个选项可以使用WHERE子句联接表: 1将表格连接起来,并将所有where子句放在@Amir Pashazadeh回答的末尾
SELECT *
FROM table1 JOIN table2
WHERE conditions_on_table1
AND conditions_on_table2 ...
2连接子查询,包括where条件
SELECT *
FROM table1
JOIN (SELECT columns_I_need
FROM table2
WHERE conditions_on_table2)
ON table1.col = table2.col
3使用WITH子句将查询切分为易于理解和测试的位
对于这种查询,我通常使用选项3。您似乎使用了ti_Kaytajantyoyksikko表和ti_esimiehentyoyksikko表两次,所以我将它们放在子查询中:
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;
一旦达到预期效果,我将添加下一部分:
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;
。。。然后
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);
。。。最后
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;
我不确定我是否正确理解了这里的所有内容,但似乎查询的驱动表是TI_kaytaja,另外两个主要表TI_SITOUMUS_kaytaja和TI_SITOUMUS提供可选数据。如果这是正确的,那么下面的查询应该为您提供您要查找的内容:
WITH cteTYOYKSIKKO AS
(SELECT DISTINCT te.TI_ET_TYOYKSIKKOID
FROM TI_ESIMIEHENTYOYKSIKKO te
WHERE te.TI_ET_KAYTTAJAID = 14784)
SELECT k.TI_KA_KAYTTAJAID AS USER_ID,
k.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_KAYTTAJA k
LEFT OUTER JOIN TI_SITOUMUS_KAYTTAJA pvm
ON pvm.TI_SK_KAYTTAJAID = k.TI_KA_KAYTTAJAID AND
pvm.TI_SK_KAYTTAJAID IN (SELECT DISTINCT tkt.TI_KT_KAYTTAJAID
FROM TI_KAYTTAJANTYOYKSIKKO tkt
INNER JOIN cteTYOYKSIKKO c
ON c.TI_ET_TYOYKSIKKOID = tkt.TI_KT_TYOYKSIKKO
LEFT OUTER JOIN TI_SITOUMUS exam
ON exam.TI_SU_SITOUMUSID = pvm.TI_SK_SITOUMUSID AND
exam.TI_SU_SITOUMUSID IN (SELECT DISTINCT tkr.TI_KR_KAYTTOKOHDEID
FROM TI_KAYTTOOIKEUS_RYHMA tkr
INNER JOIN cteTYOYKSIKKO c
ON c.TI_ET_TYOYKSIKKOID = tkr.TI_KR_KOHDEID
WHERE tkr.TI_KR_KAYTTOKOHDE = 6)
WHERE k.TI_KA_KAYTTAJAID IN (SELECT DISTINCT tk.TI_KT_KAYTTAJAID
FROM TI_KAYTTAJANTYOYKSIKKO tk
INNER JOIN cteTYOYKSIKKO c
ON c.TI_ET_TYOYKSIKKOID = tk.TI_KT_TYOYKSIKKO)
ORDER BY k.TI_KA_KAYTTAJAID
以上假设根据原始查询中是否存在+限定符,从TI_SITOUMUS_Kaytaja和TI_SITOUMUS检索的数据在查询中是可选的。如果这对其中一个或两个表都不正确,则应将联接类型从左外部联接更改为内部联接
祝你好运。我不确定我是否正确理解了这里的所有内容,但似乎查询的驱动表是TI_KAYTTAJA,另外两个主要表TI_SITOUMUS_KAYTTAJA和TI_SITOUMUS提供可选数据。如果这是正确的,那么下面的查询应该为您提供您要查找的内容:
WITH cteTYOYKSIKKO AS
(SELECT DISTINCT te.TI_ET_TYOYKSIKKOID
FROM TI_ESIMIEHENTYOYKSIKKO te
WHERE te.TI_ET_KAYTTAJAID = 14784)
SELECT k.TI_KA_KAYTTAJAID AS USER_ID,
k.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_KAYTTAJA k
LEFT OUTER JOIN TI_SITOUMUS_KAYTTAJA pvm
ON pvm.TI_SK_KAYTTAJAID = k.TI_KA_KAYTTAJAID AND
pvm.TI_SK_KAYTTAJAID IN (SELECT DISTINCT tkt.TI_KT_KAYTTAJAID
FROM TI_KAYTTAJANTYOYKSIKKO tkt
INNER JOIN cteTYOYKSIKKO c
ON c.TI_ET_TYOYKSIKKOID = tkt.TI_KT_TYOYKSIKKO
LEFT OUTER JOIN TI_SITOUMUS exam
ON exam.TI_SU_SITOUMUSID = pvm.TI_SK_SITOUMUSID AND
exam.TI_SU_SITOUMUSID IN (SELECT DISTINCT tkr.TI_KR_KAYTTOKOHDEID
FROM TI_KAYTTOOIKEUS_RYHMA tkr
INNER JOIN cteTYOYKSIKKO c
ON c.TI_ET_TYOYKSIKKOID = tkr.TI_KR_KOHDEID
WHERE tkr.TI_KR_KAYTTOKOHDE = 6)
WHERE k.TI_KA_KAYTTAJAID IN (SELECT DISTINCT tk.TI_KT_KAYTTAJAID
FROM TI_KAYTTAJANTYOYKSIKKO tk
INNER JOIN cteTYOYKSIKKO c
ON c.TI_ET_TYOYKSIKKOID = tk.TI_KT_TYOYKSIKKO)
ORDER BY k.TI_KA_KAYTTAJAID
以上假设根据原始查询中是否存在+限定符,从TI_SITOUMUS_Kaytaja和TI_SITOUMUS检索的数据在查询中是可选的。如果这对其中一个或两个表都不正确,则应将联接类型从左外部联接更改为内部联接
祝您好运。此查询中有许多问题。尝试从单个联接开始,然后添加其他表,记住结构选择。。。从…起参加在…上参加在…上哪里此外,您正在将ANSI语法与Oracle old+运算符混合使用。此查询中存在许多问题。尝试从单个联接开始,然后添加其他表,记住结构选择。。。从…起参加在…上参加在…上哪里此外,您正在将ANSI语法与Oracle old+运算符混合。最好将默认的内部联接更改为外部联接并丢失旧样式+,而不是基于FROM子句中的表列表恢复为旧样式联接。最好将默认的内部联接更改为外部联接并丢失旧样式+,而不是基于FROM子句中的表列表恢复旧式联接。