SELECT 个问题中的 JOIN 和 SELECT
JOIN and SELECT in SELECT issues
我有 3 个 table,其中总共有大约 70 列。
我想做的是 select 从 1 到 2 的所有内容,但是有一定的条件可以获得第一和最后的分数,而那些在第三 table.
SELECT
ID, NAME, TIME, ROUNDS
(SELECT SCORE
FROM TABLE2 TAB2
JOIN TABLE3 TAB3 ON TAB2.ID = TAB3.ID
WHERE PARAMETER1 = 9 AND PARAMETER2 = 21) AS FIRST,
(SELECT SCORE
FROM TABLE2 TAB2
JOIN TABLE3 TAB3 ON TAB2.ID = TAB3.ID
WHERE PARAMETER1 = 15 AND PARAMETER2 = 2) AS LAST
FROM
TABLE1 TAB1
JOIN
TABLE2 TAB2 ON TAB1.ID = TAB2.ID
GROUP BY
ID, NAME, TIME, ROUNDS
我收到以下错误:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
我也尝试在最后进行连接,我确实得到了结果,但这是错误的
SELECT
ID, NAME, TIME, ROUNDS
(SELECT SCORE
WHERE PARAMETER1 = 9 AND PARAMETER2 = 21) AS FIRST,
(SELECT SCORE
WHERE PARAMETER1 = 15 AND PARAMETER2 = 2) AS LAST
FROM
TABLE1 TAB1
JOIN
TABLE2 TAB2 ON TAB1.ID = TAB2.ID
JOIN
TABLE3 TAB3 ON TAB2.ID = TAB3.ID
我得到了不正确的数据,因为我无法对它进行分组,因为它也希望我对参数进行分组
Msg 8120, Level 16, State 1, Line 46
Column 'PARAMETER1' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我真的不知道我做错了什么所以你们有什么办法可以帮助吗?
正如我在评论中提到的,你需要关联你的子查询,我怀疑你 认为 对 TABLE2 TAB2
的所有 3 个引用都是相同的实例说的对象。这是一种错误的理解。每次您引用一个对象时,它都是它的一个新“实例”。
因此您可能想要的是:
SELECT TAB1.ID,
TAB1.NAME,
TAB2.TIME,
TAB2.ROUNDS,
(SELECT TAB3.SCORE
FROM dbo.TABLE3 TAB3
WHERE TAB3.ID = TAB2.ID
AND TAB3.PARAMETER1 = 9
AND TAB3.PARAMETER2 = 21) AS FIRST,
(SELECT TAB3.SCORE
FROM dbo.TABLE3 TAB3
WHERE TAB3.ID = TAB2.ID
AND TAB3.PARAMETER1 = 15
AND TAB3.PARAMETER2 = 2) AS LAST
FROM dbo.TABLE1 TAB1
JOIN dbo.TABLE2 TAB2 ON TAB1.ID = TAB2.ID;
或者您最好使用条件聚合,这意味着 table dbo.TABLE3
:
的 1 次扫描
SELECT TAB1.ID,
TAB1.NAME,
TAB2.TIME,
TAB2.ROUNDS,
MAX(CASE WHEN TAB3.PARAMETER1 = 9 AND TAB3.PARAMETER2 = 21 THEN TAB3.Score END) AS FIRST,
MAX(CASE WHEN TAB3.PARAMETER1 = 15 AND TAB3.PARAMETER2 = 2 THEN TAB3.Score END) AS FIRST
FROM dbo.TABLE1 TAB1
JOIN dbo.TABLE2 TAB2 ON TAB1.ID = TAB2.ID
JOIN dbo.TABLE3 TAB3 ON TAB2.ID = TAB3.ID
GROUP BY TAB1.ID,
TAB1.NAME,
TAB2.TIME,
TAB2.ROUNDS;
请注意,列所属的 tables 是猜测的。如果不正确,您需要更正。
似乎在嵌套查询下面 return 多个值。
(SELECT SCORE
WHERE PARAMETER1 = 9 AND PARAMETER2 = 21) AS FIRST
(SELECT SCORE
WHERE PARAMETER1 = 15 AND PARAMETER2 = 2) AS LAST
您应该将 top(1) 与顺序一起使用,第一列升序,最后一列降序,如下所示。
SELECT
ID, NAME, TIME, ROUNDS
(SELECT top(1) SCORE
WHERE PARAMETER1 = 9 AND PARAMETER2 = 21 order by SCORE asc ) AS FIRST,
(SELECT top(1) SCORE
WHERE PARAMETER1 = 15 AND PARAMETER2 = 2 order by SCORE desc ) AS LAST
FROM
TABLE1 TAB1
JOIN
TABLE2 TAB2 ON TAB1.ID = TAB2.ID
JOIN
TABLE3 TAB3 ON TAB2.ID = TAB3.ID
我认为以上查询可以帮助您找到准确位置的错误。
我有 3 个 table,其中总共有大约 70 列。
我想做的是 select 从 1 到 2 的所有内容,但是有一定的条件可以获得第一和最后的分数,而那些在第三 table.
SELECT
ID, NAME, TIME, ROUNDS
(SELECT SCORE
FROM TABLE2 TAB2
JOIN TABLE3 TAB3 ON TAB2.ID = TAB3.ID
WHERE PARAMETER1 = 9 AND PARAMETER2 = 21) AS FIRST,
(SELECT SCORE
FROM TABLE2 TAB2
JOIN TABLE3 TAB3 ON TAB2.ID = TAB3.ID
WHERE PARAMETER1 = 15 AND PARAMETER2 = 2) AS LAST
FROM
TABLE1 TAB1
JOIN
TABLE2 TAB2 ON TAB1.ID = TAB2.ID
GROUP BY
ID, NAME, TIME, ROUNDS
我收到以下错误:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
我也尝试在最后进行连接,我确实得到了结果,但这是错误的
SELECT
ID, NAME, TIME, ROUNDS
(SELECT SCORE
WHERE PARAMETER1 = 9 AND PARAMETER2 = 21) AS FIRST,
(SELECT SCORE
WHERE PARAMETER1 = 15 AND PARAMETER2 = 2) AS LAST
FROM
TABLE1 TAB1
JOIN
TABLE2 TAB2 ON TAB1.ID = TAB2.ID
JOIN
TABLE3 TAB3 ON TAB2.ID = TAB3.ID
我得到了不正确的数据,因为我无法对它进行分组,因为它也希望我对参数进行分组
Msg 8120, Level 16, State 1, Line 46
Column 'PARAMETER1' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我真的不知道我做错了什么所以你们有什么办法可以帮助吗?
正如我在评论中提到的,你需要关联你的子查询,我怀疑你 认为 对 TABLE2 TAB2
的所有 3 个引用都是相同的实例说的对象。这是一种错误的理解。每次您引用一个对象时,它都是它的一个新“实例”。
因此您可能想要的是:
SELECT TAB1.ID,
TAB1.NAME,
TAB2.TIME,
TAB2.ROUNDS,
(SELECT TAB3.SCORE
FROM dbo.TABLE3 TAB3
WHERE TAB3.ID = TAB2.ID
AND TAB3.PARAMETER1 = 9
AND TAB3.PARAMETER2 = 21) AS FIRST,
(SELECT TAB3.SCORE
FROM dbo.TABLE3 TAB3
WHERE TAB3.ID = TAB2.ID
AND TAB3.PARAMETER1 = 15
AND TAB3.PARAMETER2 = 2) AS LAST
FROM dbo.TABLE1 TAB1
JOIN dbo.TABLE2 TAB2 ON TAB1.ID = TAB2.ID;
或者您最好使用条件聚合,这意味着 table dbo.TABLE3
:
SELECT TAB1.ID,
TAB1.NAME,
TAB2.TIME,
TAB2.ROUNDS,
MAX(CASE WHEN TAB3.PARAMETER1 = 9 AND TAB3.PARAMETER2 = 21 THEN TAB3.Score END) AS FIRST,
MAX(CASE WHEN TAB3.PARAMETER1 = 15 AND TAB3.PARAMETER2 = 2 THEN TAB3.Score END) AS FIRST
FROM dbo.TABLE1 TAB1
JOIN dbo.TABLE2 TAB2 ON TAB1.ID = TAB2.ID
JOIN dbo.TABLE3 TAB3 ON TAB2.ID = TAB3.ID
GROUP BY TAB1.ID,
TAB1.NAME,
TAB2.TIME,
TAB2.ROUNDS;
请注意,列所属的 tables 是猜测的。如果不正确,您需要更正。
似乎在嵌套查询下面 return 多个值。
(SELECT SCORE
WHERE PARAMETER1 = 9 AND PARAMETER2 = 21) AS FIRST
(SELECT SCORE
WHERE PARAMETER1 = 15 AND PARAMETER2 = 2) AS LAST
您应该将 top(1) 与顺序一起使用,第一列升序,最后一列降序,如下所示。
SELECT
ID, NAME, TIME, ROUNDS
(SELECT top(1) SCORE
WHERE PARAMETER1 = 9 AND PARAMETER2 = 21 order by SCORE asc ) AS FIRST,
(SELECT top(1) SCORE
WHERE PARAMETER1 = 15 AND PARAMETER2 = 2 order by SCORE desc ) AS LAST
FROM
TABLE1 TAB1
JOIN
TABLE2 TAB2 ON TAB1.ID = TAB2.ID
JOIN
TABLE3 TAB3 ON TAB2.ID = TAB3.ID
我认为以上查询可以帮助您找到准确位置的错误。