2012-07-21 2 views
1

많은 행과 열 (별칭 : bigtable)이있는 테이블과 항상 1 행이지만 여러 열 (별칭 : 1rowtable)이있는 테이블이 있다고 가정합니다. 1rowtable은 bigtable과 아무 관련이 없습니다. 스크립트가 동적으로 수정하는 일부 설정에 대해서만 있습니다. 그래서 정적 SQLCMD 변수를 사용할 수 없으며 내 스크립트에 GO 문이 있기 때문에 일반 변수를 사용할 수 없습니다.동시에 두 개의 관련없는 테이블에서 선택

이제 BOTH 테이블에 액세스하는 SELECT 문을 작성하려고합니다.

내가 할 경우

SELECT ... FROM bigtable, 1rowtable 

이 십자가가 나쁜 그래서 가입 않으며, 그 길을 갈 수 없습니다.

내가 1rowtable의 CTE를 사용하는 경우, 나는 그래서 너무 나쁜

SELECT field FROM 1rowtable 

와의 필드에 액세스해야합니다. 같은 테이블 반환 함수와 동일 : 그것은 단지 특정 데이터 유형을 반환하지만 설정이 서로 다른 데이터 유형을 가지고 있기 때문에

CREATE FUNCTION getSetting(@name nvarchar(40)) 
RETURNS TABLE 
AS 
RETURN (SELECT name FROM 1rowtable WHERE name = @name) 

는 분명 내가 전혀 스칼라 기능을 사용할 수 없습니다. 그러나 분명히 나는 ​​'SELECT .. FROM dbo.getfieldfrom1rowtable (..)'작업을하지 않고 스칼라 함수처럼 사용하고 싶습니다. 쿼리에서 1rowtable을 자주 사용하기 때문에.

또한 일을 시도 :

SELECT 
    (SELECT 
    <expression involving bigtable and 1rowtable>, 
    <expression involving bigtable and 1rowtable>, 
    <expression involving bigtable and 1rowtable>, 
    ... 
    FROM 1rowtable) 
FROM bigtable 

그러나 물론 부속 선택이 더는 존재로 시작하지 않는 경우 하나 개의 항목 ...

그래서 어떻게해야보다 선택할 수없는 이유는 무엇입니까? 그것은 'SELECT .. FROM dbo.getfieldfrom1rowtable (..)'을 매번 계속 사용해야 할 것 같은가요? 그냥 궁금해서.

추신. ms sql server 2008r2

답변

2

크로스 조인을 사용하여 테이블에서 행을 가져 오는 데는 아무런 문제가 없습니다 (특히 행이 하나 뿐인 경우).

사용 구문 :

십자가와 본질적으로 "잘못"은 어디에도 그들이 올바르게 사용하는 경우, 조인하지
select bt.*, ort.* 
from bigtable bt cross join 
    onerowtable ort 

. 문제는 부주의하게 사용되는 경우입니다. 백만 개의 행이있는 두 테이블을 조인하면 . . 글쎄, 당신의 임시 공간이 가득 차고, 당신의 프로세서 (들)은 매우 바쁠 것이고, 질의는 자원의 부족으로 결국 추락 할 것입니다.

그러나 한 행이있는 테이블을 다른 테이블에 십자가 조인하면 전혀 문제가 없습니다.

관련 문제