在SQL中组合多个表

时间:2017-11-06 07:10:15

标签: sql sql-server

我需要结合多个表的结果集。 我有一个带有from子句的查询,使用在参数中选择的每个国家/地区的表。

例如:

DataTable dt = auc.GetTradesByDate().Tables[0];
/**************************************************************/
StringBuilder sb = new StringBuilder();
sb.Append("date, symbol, symbolName, buyerId,buyerName\n");
foreach (DataRow dr in dt.Rows)
{
    sb.Append(dr["date"]);
    sb.Append("," + dr["symbol"]);
    sb.Append("," + dr["symbolName"]);
    sb.Append("," + dr["buyerId"]);
    sb.Append("," + dr["buyerName"]);

    sb.Append("\n");
}

Response.Clear();
Response.ClearHeaders();
Response.ContentType = "text/csv";
Response.Charset = "";
Response.ContentEncoding = Encoding.UTF8;
Response.Buffer = true;

Response.AddHeader("content-disposition", string.Format("attachment;filename=trades_{0:yyyy-MM-dd}.csv", DateTime.Now));


byte[] BOM = new byte[] { 0xef, 0xbb, 0xbf };
Response.BinaryWrite(BOM);
Response.BinaryWrite(Encoding.UTF8.GetBytes(sb.ToString()));
Response.Flush();
Response.End();

现在在from子句中,表名是这样的,它必须分别为每个国家运行:

@prmCountry='AU,UK,US'

如何做到这一点?

2 个答案:

答案 0 :(得分:1)

由于您的问题不是很清楚,但您正在查看一些动态SQL查询:

DECLARE @prmCountry VARCHAR(MAX)= 'AU,UK,US';
DECLARE @SQL NVARCHAR(MAX)= N'';
DECLARE @Query NVARCHAR(MAX);
SELECT @SQL+=N' left join table_'+CC.Country+' on table_'+CC.Country+'.<column> = t1.<column>'
FROM
(
    SELECT split.a.value('.', 'NVARCHAR(MAX)') [Country]
    FROM
    (
        SELECT CAST('<A>'+REPLACE(@prmCountry, ',', '</A><A>')+'</A>' AS XML) AS Country
    ) C
    CROSS APPLY Country.nodes('/A') AS split(a)
) CC;
SET @Query = 'SELECT * FROM tbl_abc t1'+@SQL+';';
PRINT @Query;
--EXECUTE sp_executesql @query

SQL查询产生:

SELECT * FROM tbl_abc t1 
left join table_AU on table_AU.<column> = t1.<column> 
left join table_UK on table_UK.<column> = t1.<column> 
left join table_US on table_US.<column> = t1.<column>;
  1. 在上文中,首先将@prmCountry值拆分为行格式。
  2. 使用@prmCountry
  3. 创建动态左连接查询

答案 1 :(得分:0)

像这样使用UNION ALL:

SELECT 
tbl_abc t1
left outer join tbl_country_('AU') t2
on.....

UNION ALL

SELECT 
tbl_abc t1
left outer join tbl_country_('US') t2
on.....

...and so on