2012-10-11 78 views
0

我想加入這些語句:鏈接兩個表沒有任何共同之處

select min(len(Password)) as min, 
     max(len(Password)) as max, 
     avg(len(Password)) as avg 
FROM Customer.dbo.Password 

UNION ALL 
select min(len(password2)) as min, 
     max(len(password2)) as max, 
     avg(len(password2)) as avg 
FROM website.dbo.password2 

對於這些:

SELECT c.name COLLATE SQL_Latin1_General_CP1_CI_AS colName, o.name COLLATE SQL_Latin1_General_CP1_CI_AS tableName, 'website' db FROM website.sys.all_columns as c INNER JOIN website.sys.all_objects o ON c.object_id = o.object_id WHERE c.name like '%password%' AND type = 'U' 

UNION 
SELECT c.name COLLATE SQL_Latin1_General_CP1_CI_AS colName, o.name COLLATE SQL_Latin1_General_CP1_CI_AS tableName, 'Customer' db FROM Customer.sys.all_columns as c INNER JOIN Customer.sys.all_objects o ON c.object_id = o.object_id WHERE c.name like '%password%' AND type = 'U' 

他們沒有共同的列。前兩個SELECT語句產生密碼長度的最小值,最大值和平均值的三列,其次兩個產生保存密碼的colName,tableName和db名稱。

我想在一個表中顯示兩個結果集純粹是出於視覺原因,以獲得相應的min,max,avg到適當的colName,tableName和db。

我試圖做這樣說:

DECLARE @numberTable TABLE (link nvarchar(500), max int, min int, avg int) 
INSERT INTO @numberTable 

select 'link', min(len(Password)) as min, 
     max(len(Password)) as max, 
     avg(len(Password)) as avg 
FROM Customer.dbo.Password UNION ALL 
select 'link', min(len(password2)) as min, 
     max(len(password2)) as max, 
     avg(len(password2)) as avg 
FROM website.dbo.password2 

SELECT * FROM @numberTable ORDER BY max 

DECLARE @myTable TABLE (link nvarchar(500), colName nvarchar(500), tableName nvarchar(500), db nvarchar(500)) 
INSERT INTO @myTable 

SELECT 'link', c.name COLLATE SQL_Latin1_General_CP1_CI_AS colName, o.name COLLATE SQL_Latin1_General_CP1_CI_AS tableName, 'website' db FROM website.sys.all_columns as c INNER JOIN website.sys.all_objects o ON c.object_id = o.object_id WHERE c.name like '%password%' AND type = 'U' UNION 

SELECT 'link', c.name COLLATE SQL_Latin1_General_CP1_CI_AS colName, o.name COLLATE SQL_Latin1_General_CP1_CI_AS tableName, 'Customer' db FROM Customer.sys.all_columns as c INNER JOIN Customer.sys.all_objects o ON c.object_id = o.object_id WHERE c.name like '%password%' AND type = 'U' 

SELECT * FROM @myTable ORDER BY db 

SELECT link 
FROM @myTable 
LEFT OUTER JOIN @numberTable 
ON @myTable.link = @numberTable.link 

不幸的是這沒有奏效。

我正在使用Microsoft SQL Server 2008.

希望我以後說的是有道理的。

回答

1

您可以使用cross join連接兩個不相關的表:

SELECT c.name COLLATE SQL_Latin1_General_CP1_CI_AS colName 
,  o.name COLLATE SQL_Latin1_General_CP1_CI_AS tableName 
,  'website' db 
,  pwd.[min] 
,  pwd.[max] 
,  pwd.[avg] 
FROM website.sys.all_columns as c 
INNER JOIN 
     website.sys.all_objects o 
ON  c.object_id = o.object_id 
CROSS JOIN 
     (
     select min(len(Password)) as min, 
       max(len(Password)) as max, 
       avg(len(Password)) as avg 
     FROM website.dbo.Password   
     ) as pwd 
WHERE c.name like '%password%' 
     AND type = 'U' 

UNION 

SELECT c.name COLLATE SQL_Latin1_General_CP1_CI_AS colName 
,  o.name COLLATE SQL_Latin1_General_CP1_CI_AS tableName 
,  'Customer' db 
,  pwd.[min] 
,  pwd.[max] 
,  pwd.[avg] 
FROM Customer.sys.all_columns as c 
INNER JOIN 
     Customer.sys.all_objects o 
ON  c.object_id = o.object_id 
CROSS JOIN 
     (
     select min(len(Password)) as min, 
       max(len(Password)) as max, 
       avg(len(Password)) as avg 
     FROM Customer.dbo.Password   
     ) as pwd 
WHERE c.name like '%password%' 
     AND type = 'U' 
+0

謝謝,這個作品。 – Alias

0

創建任意東西,他們的共同點和他們一起

Select * 
from 
(
select 
     1 as RowID, 
     min(len(Password)) as min, 
     max(len(Password)) as max, 
     avg(len(Password)) as avg 
FROM Customer.dbo.Password 

UNION ALL 
select 
     2, 
     min(len(password2)) as min, 
     max(len(password2)) as max, 
     avg(len(password2)) as avg 
FROM website.dbo.password2 
) t1 
inner join 
(


SELECT 1 as RowID, c.name COLLATE SQL_Latin1_General_CP1_CI_AS colName, o.name COLLATE SQL_Latin1_General_CP1_CI_AS tableName, 'website' db FROM website.sys.all_columns as c INNER JOIN website.sys.all_objects o ON c.object_id = o.object_id WHERE c.name like '%password%' AND type = 'U' 

UNION 
SELECT 2, c.name COLLATE SQL_Latin1_General_CP1_CI_AS colName, o.name COLLATE SQL_Latin1_General_CP1_CI_AS tableName, 'Customer' db FROM Customer.sys.all_columns as c INNER JOIN Customer.sys.all_objects o ON c.object_id = o.object_id WHERE c.name like '%password%' AND type = 'U' 
) t2 
    on t1.rowID = t2.rowID 
相關問題