很抱歉这个新手问题,但过去几个小时我一直在用一些简单的东西撕掉我的头发。
我有一张桌子(single_elim):
\> let a = 42 :: Int
\> let b = 100.0 :: Double
\> "string: " ++ cast a -- Int -> String
"string: 42"
\> b * cast a -- Int -> Double
4200.0
我想写一个给玩家给我他的对手的查询。 不幸的是我无法知道玩家是在播放器1列还是播放器2(但我知道它们是互斥的)列,所以我希望有一个可能的解决方案:
id_tournament phase player1 player2
1 1 1 2
1 1 3 4
1 1 5 10
但是语句返回0行。
如果我运行单一陈述:
SELECT p AS opponent FROM (
(
SELECT player1 as p FROM single_elim
WHERE
id_tournament = 1 AND
phase = 1 AND
player2 = 4
) UNION ALL (
SELECT player2 as p FROM single_elim
WHERE
id_tournament = 1 AND
phase = 1 AND
player1 = 4
)
) x;
假设player2将在第4列,那么它可以工作,我得到一行p = 3的结果。
我也尝试了SELECT player1 as p FROM single_elim
WHERE
id_tournament = 1 AND
phase = 1 AND
player2 = 4
,我也尝试了不同类型的查询,我本来期望它可以工作,我的结论是我错过了一些关于工会如何工作的基本原则,但是经过一些研究我还没有管理过弄明白。
另一个单独工作但不与工会合作的例子是:
UNION
感谢任何帮助,非常感谢。
答案 0 :(得分:0)
您观察的行为确实很奇怪,第一个UNION应该返回一行。 (数据值是整数类型还是字符串类型?)
但是,你不应该需要UNION,除非这是一个巨大的表格,你需要尽可能地优化索引的使用。
DelegatingDataSource
答案 1 :(得分:0)
我认为括号搞乱了。无论如何,你不需要包装选择查询,联合就足够了。这个很好用:
SELECT player1 as p FROM single_elim
WHERE
id_tournament = 1 AND
phase = 2 AND
player2 = 4
UNION ALL
SELECT player2 as p FROM single_elim
WHERE
id_tournament = 1 AND
phase = 2 AND
player1 = 4;