我有以下代码:
bool oldContainLetter = Regex.IsMatch(oldPinNumber, "[a-zA-Z]")
这给我一个错误:“ SQL命令未正确结束。”至少first JOIN不起作用,我也不知道如何解决。最终,我试图实现这一目标:Using Oracle combine three tables to one with PIVOT,但是在连接表时应该使用某种JOIN语法。
答案 0 :(得分:3)
您有三种选择来使用WHERE子句联接表:
1加入表并将所有where子句放在末尾(如@Amir Pashazadeh回答的那样。
SELECT *
FROM table1 JOIN table2
WHERE conditions_on_table1
AND conditions_on_table2 ...
2加入子查询,包括条件
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,所以我将它们放在子查询中:
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;
答案 1 :(得分:1)
将所有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 JOINS
一起使用,如果要使用ANSI JOINS
,请使用LEFT JOIN
和RIGHT JOIN
而不是{{1} }。
答案 2 :(得分:0)
查询中有很多问题。您需要:
SELECT
FROM table1, table2, table3 -- since you're using (+)
WHERE table2.joinKeyTable1 (+) = table1.joinKeyTable2
AND table3.joinKeyTable1 (+) = table1.joinKeyTable3
AND <all filters>
注意:由于它是一个外部联接-如您所需要,因此您需要在table2的任何列旁边加上(+),并在所有过滤器中使用table3:示例:
AND table2.columnX (+) IN (...)
或
AND table3.columnY (+) = ...
这将检索table2或table3中没有对应(子代)的table1的所有记录,而不管您在对应的table2 / table3列上的过滤器是什么
答案 3 :(得分:0)
我不确定这里是否正确理解了所有内容,但看来查询的驱动表是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_KAYTTAJA
限定词,以上假设从TI_SITOUMUS
和(+)
检索的数据在查询中是可选的。如果这对于这两个表中的一个或两个都不正确,则应将联接类型从LEFT OUTER JOIN
更改为INNER JOIN
。
好运。