UNION的替代品? [英] a substitute for UNION?

查看:493
本文介绍了UNION的替代品?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想更改查询:


SELECT DM。*,''condition1'',NULL FROM DM

WHERE(condition1)

UNION

SELECT DM。*,NULL,''condition2''FROM DM

WHERE(condition2)

>
到这样一个SELECT


SELECT DM。*,WasCondition1,WasCondition2 FROM DM

WHERE(condition1)或(condition2)


但是如何填写WasConditionX栏?

UNION版本不好,因为如果一行满足2

条件,它重复而不是加入它们,如下所示:


SELECT DM。*,''condition1'',''condition2''FROM DM

WHERE condition1 AND condition2

UNION

SELECT DM。*,''condition1'',NULL FROM DM

WHERE condition1 AND NOT condition2

UNION

SELECT DM。*,NULL,''condition2''FROM DM

WHERE NOT condition1 AND condition2

或(比如DM有列A,B,C):


SELECT A,B,C,SUM(cond1),SUM(cond2)FROM



SELECT DM。*,1 AS cond1,0 AS cond2 FROM DM

WHERE condition1

UNION

SELECT DM。*,0 AS cond1,1 AS cond2 FROM DM

WHERE condition2

)AS DM

GROUP BY A,B,C

解决方案

2月19日,20:46,bbl ... @ op.pl写道:


我想更改查询:

SELECT DM。*,''condition1'',NULL FROM DM

WHERE(条件1)

UNION

SELECT DM。*,NULL,''condition2''FROM DM

哪里(条件2)


到这样一个SELECT


SELECT DM。*,WasCondition1,WasCondition2 FROM DM

WHERE(condition1)或(condition2)


但是如何填写WasConditionX列?

UNION版本不好因为以防万一一行满足2

条件,重复而不是加入它们,如下所示:


SELECT DM。*,''condition1'',' 'condition2''来自DM

WHERE condition1 AND condition2

UNION

SELECT DM。*,''condition1'',NULL FROM DM

WHERE condition1 AND NOT condition2

UNION

SELECT DM。*,NULL,''condition2''FROM DM

WHERE NOT condition1 AND condition2


或(比如DM有列A,B,C):


SELECT A,B,C, SUM(cond1),SUM(cond2)FROM



SELECT DM。*,1 AS cond1,0 AS cond2 FROM DM

WHERE条件1

UNION

SELECT DM。*,0 AS cond1,1 AS cond2 FROM DM

WHERE condition2

)AS DM

GROUP BY A,B,C



使用CASE表达式。为了适应你的第二个例子:


SELECT col1,col2,col3,

CASE WHEN(condition1)那么'''''''''''''' END AS WasCondition1,

CASE WHEN(condition2)那么'''''''''''''''''''''''''''''''''''''''''''$ $ $ $ $ $ $ $ br />

总是避免使用SELECT *。

-

David Portas,SQL Server MVP


请尽可能发布足够的代码来重现您的问题。

包含CREATE TABLE和INSERT语句通常会有所帮助。

说明您正在使用的SQL Server版本并指定任何错误消息的内容



SQL Server联机丛书:
http://msdn2.microsoft.com/library/m...S,SQL.90)。 aspx

-


使用CASE表达式。为了适应你的第二个例子:


>

SELECT col1,col2,col3,

CASE WHEN( condition1)那么'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
WHERE(condition1)OR(condition2);



那么,每个条件都会被检查两次 - 性能

减少(条件使用子查询)?


始终避免使用SELECT *。



为什么?


我会告诉你我的查询里面没有想要出于某种原因编译

(关键字GROUP附近的语法不正确):

DECLARE @pp INT

SET @pp = 7

SELECT SUM(已发送)AS已发送,SUM(已接收)AS已收到,[ID]


FROM(


SELECT 1 AS已发送,0 AS已收到,

DM。* FROM WSDMS..DocumentMessages DM WHERE DM.ObsoleteDate IS NULL

AND DM.SenderID = @ pp


UNION


SELECT 0 AS已发送,1 AS收到,

DM。*来自WSDMS .. DocumentMessages DM WHERE DM.ObsoleteDate IS NULL

AND DM.ReceiverPersonID = @pp


UNION


SELECT 0 AS已发送,1 AS收到,

DM。* FROM WSDMS..DocumentMessages DM WHERE DM.ObsoleteDate IS NULL

AND DM.ReceiverDepartmentID IN

(SELECT PD.DepartmentID FROM CF..PersonnelDepartment PD

WHERE PD.P ersonID = @pp AND PD.ObsoleteDate IS NULL)

AND DM.StationID IN

(SELECT PS.StationID FROM CF..PersonnelStationsResponsibility PS

WHERE PS.PersonID = @pp AND PS.ObsoleteDate IS NULL)


UNION


SELECT 0 AS已发送,1 AS已收到,

DM。* FROM WSDMS..DocumentMessages DM WHERE DM.ObsoleteDate IS NULL

AND DM.ReceiverDepartmentID IN

(SELECT PD.DepartmentID FROM CF ..PersonnelDepartment PD

WHERE PD.PersonID = @pp AND PD.ObsoleteDate IS NULL)

AND DM.InstructionNr IN

(SELECT I .InstructionNr FROM WSDMS..InstructionsNewest I

WHERE I.PUID = @pp AND I.PUID IN

(从WSDMS中选择PU.ID PU,PU在哪里。 PersonID = @pp)







GROUP BY [ID]


I''d like to change query:

SELECT DM.*, ''condition1'', NULL FROM DM
WHERE (condition1)
UNION
SELECT DM.*, NULL, ''condition2'' FROM DM
WHERE (condition2)

to one SELECT like this

SELECT DM.*, WasCondition1, WasCondition2 FROM DM
WHERE (condition1) or (condition2)

but how to fill in the WasConditionX column?
The UNION version was bad because in case a row fulfilled 2
conditions, it was repeated instead of joining them, such like this:

SELECT DM.*, ''condition1'', ''condition2'' FROM DM
WHERE condition1 AND condition2
UNION
SELECT DM.*, ''condition1'', NULL FROM DM
WHERE condition1 AND NOT condition2
UNION
SELECT DM.*, NULL, ''condition2'' FROM DM
WHERE NOT condition1 AND condition2

or (say DM has columns A, B, C):

SELECT A, B, C, SUM(cond1), SUM(cond2) FROM
(
SELECT DM.*, 1 AS cond1, 0 AS cond2 FROM DM
WHERE condition1
UNION
SELECT DM.*, 0 AS cond1, 1 AS cond2 FROM DM
WHERE condition2
) AS DM
GROUP BY A, B, C

解决方案

On 19 Feb, 20:46, bbl...@op.pl wrote:

I''d like to change query:

SELECT DM.*, ''condition1'', NULL FROM DM
WHERE (condition1)
UNION
SELECT DM.*, NULL, ''condition2'' FROM DM
WHERE (condition2)

to one SELECT like this

SELECT DM.*, WasCondition1, WasCondition2 FROM DM
WHERE (condition1) or (condition2)

but how to fill in the WasConditionX column?
The UNION version was bad because in case a row fulfilled 2
conditions, it was repeated instead of joining them, such like this:

SELECT DM.*, ''condition1'', ''condition2'' FROM DM
WHERE condition1 AND condition2
UNION
SELECT DM.*, ''condition1'', NULL FROM DM
WHERE condition1 AND NOT condition2
UNION
SELECT DM.*, NULL, ''condition2'' FROM DM
WHERE NOT condition1 AND condition2

or (say DM has columns A, B, C):

SELECT A, B, C, SUM(cond1), SUM(cond2) FROM
(
SELECT DM.*, 1 AS cond1, 0 AS cond2 FROM DM
WHERE condition1
UNION
SELECT DM.*, 0 AS cond1, 1 AS cond2 FROM DM
WHERE condition2
) AS DM
GROUP BY A, B, C

Use a CASE expression. To adapt your second example:

SELECT col1, col2, col3,
CASE WHEN (condition1) THEN ''Y'' ELSE ''N'' END AS WasCondition1,
CASE WHEN (condition2) THEN ''Y'' ELSE ''N'' END AS WasCondition2
WHERE (condition1) OR (condition2) ;

Always avoid using SELECT *.
--
David Portas, SQL Server MVP

Whenever possible please post enough code to reproduce your problem.
Including CREATE TABLE and INSERT statements usually helps.
State what version of SQL Server you are using and specify the content
of any error messages.

SQL Server Books Online:
http://msdn2.microsoft.com/library/m...S,SQL.90).aspx
--


Use a CASE expression. To adapt your second example:

>
SELECT col1, col2, col3,
CASE WHEN (condition1) THEN ''Y'' ELSE ''N'' END AS WasCondition1,
CASE WHEN (condition2) THEN ''Y'' ELSE ''N'' END AS WasCondition2
WHERE (condition1) OR (condition2) ;


Well, then each condition will be checked twice -- performance
decreases (the conditions use subqueries)?

Always avoid using SELECT *.

Why?


I''ll show you my query which doesn''t want to compile for some reason
(Incorrect syntax near the keyword GROUP):

DECLARE @pp INT
SET @pp = 7
SELECT SUM(Sent) AS Sent, SUM(Received) AS Received, [ID]

FROM (

SELECT 1 AS Sent, 0 AS Received,
DM.* FROM WSDMS..DocumentMessages DM WHERE DM.ObsoleteDate IS NULL
AND DM.SenderID = @pp

UNION

SELECT 0 AS Sent, 1 AS Received,
DM.* FROM WSDMS..DocumentMessages DM WHERE DM.ObsoleteDate IS NULL
AND DM.ReceiverPersonID = @pp

UNION

SELECT 0 AS Sent, 1 AS Received,
DM.* FROM WSDMS..DocumentMessages DM WHERE DM.ObsoleteDate IS NULL
AND DM.ReceiverDepartmentID IN
(SELECT PD.DepartmentID FROM CF..PersonnelDepartment PD
WHERE PD.PersonID = @pp AND PD.ObsoleteDate IS NULL)
AND DM.StationID IN
(SELECT PS.StationID FROM CF..PersonnelStationsResponsibility PS
WHERE PS.PersonID = @pp AND PS.ObsoleteDate IS NULL)

UNION

SELECT 0 AS Sent, 1 AS Received,
DM.* FROM WSDMS..DocumentMessages DM WHERE DM.ObsoleteDate IS NULL
AND DM.ReceiverDepartmentID IN
(SELECT PD.DepartmentID FROM CF..PersonnelDepartment PD
WHERE PD.PersonID = @pp AND PD.ObsoleteDate IS NULL)
AND DM.InstructionNr IN
(SELECT I.InstructionNr FROM WSDMS..InstructionsNewest I
WHERE I.PUID = @pp AND I.PUID IN
(SELECT PU.ID FROM WSDMS..PUs PU WHERE PU.PersonID = @pp)
)

)

GROUP BY [ID]


这篇关于UNION的替代品?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆