2010-07-28 3 views
-1

다음과 같은 SQL 문이 있습니다. union 키워드를 사용하지 않고이 sql 문의 결과에 단일 행 (code = 0, desc = 1)을 추가하려면 어떻게합니까? 감사.공용어를 사용하지 않고 SQL 문을 작성하는 방법은 무엇입니까?

select code, desc 
from material 
where material.ExpireDate ='2010/07/23' 
+3

를 제공? 회견? – pascal

+0

UNION은 때때로 DB 공급자에 의해 잘못 처리됩니다. 한 가지 예가 Delphi의 TClientDataSet + TDataSetProvider입니다. – too

+2

결과 집합을 반환하는 저장 프로 시저는 어떻습니까? 또는 호출자 코드에이 의사 행을 추가 하시겠습니까? BTW 당신은 ​​이미 SQL 키워드처럼'DESC'를 컬럼 이름으로 사용하는 데 문제가 없습니까? – pascal

답변

3

당신은 항상 당신이 노동 조합 또는 뷰 중 하나를 사용하지 않기 때문에 그 자체가 UNION 키워드

CREATE VIEW material_view AS SELECT code, desc, ExpireDate FROM material UNION SELECT '0', '1', NULL; 
SELECT code, desc FROM material_view WHERE ExpireDate = '2010/07/23' OR code = '0'; 
+0

보기를 사용하고 싶지 않습니다. – mkus

+6

답을'-1' 할 필요가 없습니다 ... 당신의 질문에서보기 회피는 언급하지 않았습니다. – pascal

+1

빈 날짜 (및 기타 필드)와 코드 '0'이있는 자료에 새 행을 추가하고 SELECT 코드, desc FROM 재질에서 ExpireDate = '2010/07/23'OR 코드 = '0'; – too

0

를 사용하여 테이블에 대한 뷰를 만들 수 있습니다, 나는 더미를 추가하는 게 좋을 것 (. 코드 = 0, DESC = 1, 및 일반적으로 선택하지 않을 것 EXPIREDATE에 뭔가 - - 예를 들어, 01 1900 년 1 월) 재료 테이블 행은 다음과 같은 쿼리를 사용 :

select code, desc 
from material 
where material.ExpireDate ='2010/07/23' or 
    material.ExpireDate ='1900/01/01' 

일반적으로, 연합은 y 기본 옵션. `UNION`를 사용하지 않는 이유는

1
WITH material AS 
(
SELECT * 
FROM 
     (VALUES (2, 'x', '2010/07/23'), 
       (3, 'y', '2009/01/01'), 
       (4, 'z', '2010/07/23')) vals (code, [desc], ExpireDate) 
) 

SELECT 
    COALESCE(m.code,x.code) AS code, 
    COALESCE(m.[desc],x.[desc]) AS [desc] 
FROM material m 
FULL OUTER JOIN (SELECT 0 AS code, '1' AS [desc]) x ON 1=0 
WHERE m.code IS NULL OR m.ExpireDate ='2010/07/23' 

code  desc 
----------- ---- 
2   x 
4   z 
0   1 
+0

'UNION ALL '을 행 생성자로 대체 할 수 있습니다. '.. (VALUES (2, 'x', '2010/07/23'), (3, 'y', '2010/07/23'), (4, 'z', '2010/07/23 ')) AS 자료 (코드, [desc], ExpireDate) ...' – onedaywhen

+0

@onedaywhen - 네가 해냈습니다. 좋은 제안 감사! –

관련 문제