SQL Anywhere (12) - 左连接,还不够 distinct/unique 吗?
SQL Anywhere (12) - Left Join, not distinct/unique enough?
抱歉标题不好,不知道怎么说才好。
我正在尝试排除具有包含 x、y 或 z
的 child 的任何 parent 实例
SELECT P.label, P.creationclass, P.attributes, P.type, P.uniqueid, C.label, C.idx, C.PID, C.creationclass, C.attributes, C.type, C.uniqueid
FROM t_equip_template AS P
LEFT JOIN t_equip_template AS C
ON P.ID = C.PID //only way to join these
WHERE P.type = '1003'
AND
C.creationclass NOT LIKE x
AND
C.creationclass NOT LIKE y
AND
C.creationclass NOT LIKE z;
为了进一步解释,我的结果集删除了某些东西的实例
C.creationclass NOT LIKE [x y or z]
但这不够明显,因为在某些情况下上述是正确的,但我仍然得到一个包含 P.ID 的结果,其中 children 之一实际上有 x ,y,z 为真(尽管它们未显示在结果列表中)。我宁愿把整件事都扔掉,而不仅仅是 'instance where x,y,z is or is not true'
因为这是我连接两个表的唯一方法
P.ID = C.PID
我仍然得到我不想要的 P.ID 实例。
有没有办法合并 'P.uniqueid' 并且如果 'x,y,z' 是或不是 'P.ID = C.PID' 那么抛出 P.uniqueid 而不仅仅是那个特定的实例'C.PID'/'P.uniqueid'?
感谢您的帮助。
示例:
P.ID P.uniqueid C.PID C.creationclass
1 00001 1 w <--There is a 'hidden result' x,y or z for this
1 00001 1 v <--There is a 'hidden result' x for this
1 00001 1 u <--There is a 'hidden result' x for this
2 00002 2 w
2 00002 2 v
3 00003 3 w
3 00003 3 v
我想要的是:
P.ID P.uniqueid C.PID C.creationclass
2 00002 2 w
2 00002 2 v
3 00003 3 w
3 00003 3 v
我想要的结果是抛出 00001 的每个实例,而不是只抛出不符合条件的特定实例。
解决方案,感谢@JohnBollinger
SELECT
P.label,
P.creationclass,
P.attributes,
P.type,
P.uniqueid,
C.label,
C.idx,
C.PID,
C.creationclass,
C.attributes,
C.type,
C.uniqueid
FROM
t_equip_template AS P
LEFT JOIN t_equip_template AS C
ON P.ID = C.PID
WHERE
P.type = '1003'
AND
AND NOT EXISTS (
SELECT 1 FROM
t_equip_template AS C2
WHERE
P.ID = C2.PID
AND (C2.creationclass LIKE x
OR C2.creationclass LIKE y
OR C2.idx LIKE z )
)
如果我正确理解你的问题,你需要使用 NOT EXISTS
(假设 SQLAnywhere 允许该语法)。
SELECT
P.label,
P.creationclass,
P.attributes,
P.type,
P.uniqueid,
C.label,
C.idx,
C.PID,
C.creationclass,
C.attributes,
C.type,
C.uniqueid
FROM
t_equip_template AS P
LEFT JOIN t_equip_template AS C ON P.ID = C.PID
WHERE
P.type = '1003' AND
NOT EXISTS
(
SELECT *
FROM
t_equip_template C
WHERE
C.PID = P.PID AND
C.creationclass IN (x, y, z)
)
这是完成您所要求的一种方法:
SELECT
P.label,
P.creationclass,
P.attributes,
P.type,
P.uniqueid,
C.label,
C.idx,
C.PID,
C.creationclass,
C.attributes,
C.type,
C.uniqueid
FROM
t_equip_template AS P
LEFT JOIN t_equip_template AS C
ON P.ID = C.PID
WHERE
P.type = '1003'
AND NOT EXISTS (
SELECT 1 FROM
t_equip_template AS C2
WHERE
P.ID = C2.PID
AND (C2.creationclass LIKE x
OR C2.creationclass LIKE y
OR C2.creationclass LIKE z)
)
您不能使用仅考虑联接结果的单行的任何联接或筛选条件来执行此操作,因为您要筛选的信息是多行的函数。
抱歉标题不好,不知道怎么说才好。
我正在尝试排除具有包含 x、y 或 z
的 child 的任何 parent 实例SELECT P.label, P.creationclass, P.attributes, P.type, P.uniqueid, C.label, C.idx, C.PID, C.creationclass, C.attributes, C.type, C.uniqueid
FROM t_equip_template AS P
LEFT JOIN t_equip_template AS C
ON P.ID = C.PID //only way to join these
WHERE P.type = '1003'
AND
C.creationclass NOT LIKE x
AND
C.creationclass NOT LIKE y
AND
C.creationclass NOT LIKE z;
为了进一步解释,我的结果集删除了某些东西的实例
C.creationclass NOT LIKE [x y or z]
但这不够明显,因为在某些情况下上述是正确的,但我仍然得到一个包含 P.ID 的结果,其中 children 之一实际上有 x ,y,z 为真(尽管它们未显示在结果列表中)。我宁愿把整件事都扔掉,而不仅仅是 'instance where x,y,z is or is not true'
因为这是我连接两个表的唯一方法
P.ID = C.PID
我仍然得到我不想要的 P.ID 实例。
有没有办法合并 'P.uniqueid' 并且如果 'x,y,z' 是或不是 'P.ID = C.PID' 那么抛出 P.uniqueid 而不仅仅是那个特定的实例'C.PID'/'P.uniqueid'?
感谢您的帮助。
示例:
P.ID P.uniqueid C.PID C.creationclass
1 00001 1 w <--There is a 'hidden result' x,y or z for this
1 00001 1 v <--There is a 'hidden result' x for this
1 00001 1 u <--There is a 'hidden result' x for this
2 00002 2 w
2 00002 2 v
3 00003 3 w
3 00003 3 v
我想要的是:
P.ID P.uniqueid C.PID C.creationclass
2 00002 2 w
2 00002 2 v
3 00003 3 w
3 00003 3 v
我想要的结果是抛出 00001 的每个实例,而不是只抛出不符合条件的特定实例。
解决方案,感谢@JohnBollinger
SELECT
P.label,
P.creationclass,
P.attributes,
P.type,
P.uniqueid,
C.label,
C.idx,
C.PID,
C.creationclass,
C.attributes,
C.type,
C.uniqueid
FROM
t_equip_template AS P
LEFT JOIN t_equip_template AS C
ON P.ID = C.PID
WHERE
P.type = '1003'
AND
AND NOT EXISTS (
SELECT 1 FROM
t_equip_template AS C2
WHERE
P.ID = C2.PID
AND (C2.creationclass LIKE x
OR C2.creationclass LIKE y
OR C2.idx LIKE z )
)
如果我正确理解你的问题,你需要使用 NOT EXISTS
(假设 SQLAnywhere 允许该语法)。
SELECT
P.label,
P.creationclass,
P.attributes,
P.type,
P.uniqueid,
C.label,
C.idx,
C.PID,
C.creationclass,
C.attributes,
C.type,
C.uniqueid
FROM
t_equip_template AS P
LEFT JOIN t_equip_template AS C ON P.ID = C.PID
WHERE
P.type = '1003' AND
NOT EXISTS
(
SELECT *
FROM
t_equip_template C
WHERE
C.PID = P.PID AND
C.creationclass IN (x, y, z)
)
这是完成您所要求的一种方法:
SELECT
P.label,
P.creationclass,
P.attributes,
P.type,
P.uniqueid,
C.label,
C.idx,
C.PID,
C.creationclass,
C.attributes,
C.type,
C.uniqueid
FROM
t_equip_template AS P
LEFT JOIN t_equip_template AS C
ON P.ID = C.PID
WHERE
P.type = '1003'
AND NOT EXISTS (
SELECT 1 FROM
t_equip_template AS C2
WHERE
P.ID = C2.PID
AND (C2.creationclass LIKE x
OR C2.creationclass LIKE y
OR C2.creationclass LIKE z)
)
您不能使用仅考虑联接结果的单行的任何联接或筛选条件来执行此操作,因为您要筛选的信息是多行的函数。