Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基本sql:在一个查询中多次选择同一列,每次出现都依赖于不同的where子句_Sql - Fatal编程技术网

基本sql:在一个查询中多次选择同一列,每次出现都依赖于不同的where子句

基本sql:在一个查询中多次选择同一列,每次出现都依赖于不同的where子句,sql,Sql,执行此查询的最佳方式是什么。我有下表 带列的mytable x y 1 a 2 b 3 c 我想(在伪sql中) 什么时候 所以我想作为一个结果 1, 2, 3 我目前正在使用cte和一个非常大的数据集,我试图减少查询时间,是否总是需要进行3次表扫描?您应该使用3次查询。在进行自联接时,使用适当的索引将更快。此外,它将更具可读性 SELECT Case When y = 1 Then x1 When y = 2 Then x2 Else x3 End FROM mytable 如果您想要

执行此查询的最佳方式是什么。我有下表

带列的mytable

x y 
1 a
2 b
3 c
我想(在伪sql中)

什么时候

所以我想作为一个结果

1, 2, 3

我目前正在使用cte和一个非常大的数据集,我试图减少查询时间,是否总是需要进行3次表扫描?

您应该使用3次查询。在进行自联接时,使用适当的索引将更快。此外,它将更具可读性

SELECT Case When y = 1 Then x1 When y = 2 Then x2 Else x3 End FROM mytable
如果您想要一个查询调用,可能是这样:)

另一个解决方案:

SELECT x, y FROM table WHERE y IN ('a', 'b')
您将获得一个结果集:

x | y
-----
1 | a
2 | b

然后,可以在应用程序中使用此结果集来获得所需的结果。

我的建议是选择按y列排序或分组的结果,并使用该信息将结果集拆分为多个列表,以便应用程序进行处理。如果只想在数据库中执行此操作,恐怕需要多次表扫描(或联接)


另一种修复方法是将y列中的信息迁移到另一个表(带有外键引用),以便能够更有效地连接到该表。

在给出的示例中,只有3行输入和一行输出。我假设将至少涉及一个其他列,这样输入数据:

w  x  y
---------
w1 1  a
w1 2  b
w1 3  c
w2 4  a
w2 5  b
w2 6  c
.
.
.
将成为输出:

w  x1 x2 x3
-----------
w1 1  2  3
w2 4  5  6
.
.
.
这可以使用以下查询在一次过程中完成:

select w,
       max(case when y = 'a' then x end) x1,
       max(case when y = 'b' then x end) x2,
       max(case when y = 'c' then x end) x3
from datatable
where y in ('a','b','c')
group by w

从您的问题来看,您似乎想要条件的最后三个实例,或者将三个不同的条件联系在一起。以下示例是否满足您的问题:

mytable:
(unique keys 1..n)      (col1)  
student-id | course-id | grade
s1           gen101      g1
s1           cmp202      g2
s1           psy303      g3
s1           c4          g4
s2           c1          g5
假设我们只想要有三门特定课程(gen101、cmp202和psy303)的学生,并在忽略其他人的情况下显示这些成绩

select gen.student-id  as student-id
     , gen.grade       as gen101-gr
     , cmp.grade       as cmp202-gr
     , psy.grade       as psy303-gr
  from mytable  gen
     , mytable  cmp
     , mytable  psy
 where gen.course-id    = 'gen101'
   and gen.student-id   = cmp.student-id
   and cmp.course-id    = 'cmp202'
   and cmp.studnet-id   = psy.student-id
   and psy.course-id    = 'psy303'
这应该给出一行:

student-id  gen101-gr cmp202-gr psy303-gr
s1          g1        g2        g3
希望这能给你足够的时间去做。

我当然会这样做:

SELECT
    tableRowA.x as x1
    tableRowB.x as x2
    tableRowC.x as x3
FROM
    table as tableRowA,
    table as tableRowB,
    table as tableRowC
WHERE
    tableRowA.y = 1
    tableRowB.y = 2
    tableRowC.y = 3
更容易理解,如果需要从每行中提取多个列,则可以提取更多信息

MySQL 5.5.32架构设置

CREATE TABLE Table1
    (`x` int, `y` varchar(1))
;

INSERT INTO Table1
    (`x`, `y`)
VALUES
    (1, 'a'),
    (2, 'b'),
    (3, 'c')
;

CREATE TABLE mytable
    (`x` int, `y` varchar(1))
;

INSERT INTO mytable
    (`x`, `y`)
VALUES
    (1, 'a'),
    (2, 'b'),
    (3, 'c')
;
SELECT x1.x as x1, x2.x as x2, x3.x as x3
FROM mytable x1
INNER JOIN mytable x2 ON x2.y='b'
INNER JOIN mytable x3 ON x3.y='c'
WHERE x1.y='a'
| X1 | X2 | X3 |
|----|----|----|
|  1 |  2 |  3 |
查询1

CREATE TABLE Table1
    (`x` int, `y` varchar(1))
;

INSERT INTO Table1
    (`x`, `y`)
VALUES
    (1, 'a'),
    (2, 'b'),
    (3, 'c')
;

CREATE TABLE mytable
    (`x` int, `y` varchar(1))
;

INSERT INTO mytable
    (`x`, `y`)
VALUES
    (1, 'a'),
    (2, 'b'),
    (3, 'c')
;
SELECT x1.x as x1, x2.x as x2, x3.x as x3
FROM mytable x1
INNER JOIN mytable x2 ON x2.y='b'
INNER JOIN mytable x3 ON x3.y='c'
WHERE x1.y='a'
| X1 | X2 | X3 |
|----|----|----|
|  1 |  2 |  3 |

CREATE TABLE Table1
    (`x` int, `y` varchar(1))
;

INSERT INTO Table1
    (`x`, `y`)
VALUES
    (1, 'a'),
    (2, 'b'),
    (3, 'c')
;

CREATE TABLE mytable
    (`x` int, `y` varchar(1))
;

INSERT INTO mytable
    (`x`, `y`)
VALUES
    (1, 'a'),
    (2, 'b'),
    (3, 'c')
;
SELECT x1.x as x1, x2.x as x2, x3.x as x3
FROM mytable x1
INNER JOIN mytable x2 ON x2.y='b'
INNER JOIN mytable x3 ON x3.y='c'
WHERE x1.y='a'
| X1 | X2 | X3 |
|----|----|----|
|  1 |  2 |  3 |

抱歉,但我觉得这个问题让人困惑。能否添加一些示例数据,以及您认为select语句的结果应该是什么?谢谢。请你再解释清楚好吗?我不明白你的问题中有什么意味着3次扫描吗?@Nimchinpsky是的。单表扫描解决方案需要应用程序中的一些附加逻辑我有一个非常大的数据集,这需要执行七次,没有其他选项?“单表扫描解决方案需要应用程序中的一些附加逻辑”,嗯?我添加了另一个答案。希望这样可以。您在应用程序中使用的是什么语言?太棒了,这对我来说很有效,我将其用于两个equals表=)