我有一个作业问题:
Find the celebs that have been in relationship with the same celeb.
The result should be (celeb1, celeb2, celeb3) triples,
meaning that celeb1 and celeb2 have been in relationship with celeb3.
现在表“Relationships”有celeb1和celeb2字段......其中值是VARCHAR。
我对这个问题的解决方案是:
CREATE VIEW Celeb1Rels AS
SELECT celeb1 AS c1, celeb2 AS c2 FROM relationships;
CREATE VIEW Celeb2Rels AS
SELECT celeb1 AS c2, celeb2 AS c3 FROM relationships;
SELECT * FROM Celeb1Rels NATURAL JOIN Celeb2Rels;
它工作正常。然而,教练发布了他的解决方案,他有:
SELECT X.celeb1, Y.celeb1, X.celeb2
FROM Relationships X, Relationships Y
WHERE X.celeb2=Y.celeb2 AND X.celeb1<Y.celeb1;
我不明白他为什么使用X.celeb1&lt; Y.celeb1 它确实工作并提供正确的输出,但我认为“&lt;”用于比较数字?
任何人都可以解释“&lt;”在这种情况下做什么?以及比较VARCHARS时的行为方式?
答案 0 :(得分:3)
这样你就不会得到重复的关系,例如,在celeb1和celeb2之间有2个假设的关系,而celeb1和celeb3,你想要结果
celeb2, celeb3, celeb1
你需要第二个不等式运算符来确保表格不会加入相同的关系(即celeb1和Celeb2加入到celeb1&amp; celeb2)。如果你使用你的教师查询并修改它而不是<
你使用的不是等于<>
,你会得到结果:
celeb2, celeb3, celeb1
celeb3, celeb2, celeb1
但是这些行显示的内容相同,但顺序不同,>
不等式运算符只是确保第2列始终是第1列之后的字母顺序名称。
因此,在应用于varchars时,>
运算符按字母顺序排列,因此'a' < 'b'
,'abc' > 'aaa'
等。
答案 1 :(得分:2)
我想要排除双倍记录,例如:
如果此表中有(A,B)
和(B,C)
,那么如果查询没有AND X.celeb1<Y.celeb1
,我们就会
(A,B,C)
和(B,C,A)
。添加此条件后,我们只要(A,B,C)
输出一条记录A < C
。
答案 2 :(得分:1)
教师的解决方案产生三元组,其中CELEB2有两种关系。这部分WHERE子句......
X.celeb1<Y.celeb1
...确保您只获得三个不同名人的行(即,它避免将相同的记录与自身匹配),并且每个三人组只获得一行。
不完全按照您的想法工作,按字母顺序排序。所以'ANDY GARCIA' < 'ANDY KAUFMAN'
是真的。
需要注意的事项:
'andy garcia' < 'ANDY KAUFMAN'
是假的。'11' < '2'
为真。 “我不知道这个排序问题”
通过设置NLS_SORT参数,可以使Oracle排序不敏感。然而,这不会改变比较;为此,我们需要将NLS_COMP参数更改为LINGUISTIC
。这些不是默认行为,因为那里的代码太多,可能依赖于区分大小写的排序。 Find out more。