使用select *时排除列

时间:2013-04-11 17:40:44

标签: sql sql-server-2008

使用select *时是否有排除列?当然我可以列出我想要的列,但是如果说我查询一个包含30列的表并且我想要其中的27个,那么编写像SELECT * EXCLUDE a, b, c

这样的内容会更加清晰

有没有这样做?

1 个答案:

答案 0 :(得分:0)

这是生成选择列表并消除两个表中重复列的一种方法。它假设您已经知道了两个表以及它们之间的关系。它使用AdventureWorks和表Sales.SalesOrderDetail和Sales.SalesOrderHeader。请注意,具有相同名称的多个表中的列不一定是多余的 - 例如,可以独立于订单明细项修改订单,现在您的查询(a)忽略详细级别修改日期,(b)不会t在结果中明确说明已经公开了修改日期(除非用户阅读查询文本,如果他们有权访问它)。

DECLARE @sql NVARCHAR(MAX);

;WITH l AS 
(
  SELECT column_id, name FROM sys.columns 
  WHERE [object_id] = OBJECT_ID('Sales.SalesOrderDetail')
),
r AS
(
  SELECT column_id, name FROM sys.columns 
  WHERE [object_id] = OBJECT_ID('Sales.SalesOrderHeader')
)
SELECT @sql = STUFF((SELECT ',' + CHAR(13) + CHAR(10) + CHAR(9)
  + CASE WHEN l.column_id IS NOT NULL THEN 'h.' 
  ELSE 'd.' END + QUOTENAME(COALESCE(l.name,r.name)) FROM r 
FULL OUTER JOIN l 
ON l.name = r.name
ORDER BY COALESCE(l.column_id, 255), r.column_id
FOR XML PATH, TYPE).value('.[1]','nvarchar(max)'), 1, 1, '');

SELECT @sql = N'SELECT ' + @sql + ' 
  FROM Sales.SalesOrderHeader AS h
  INNER JOIN Sales.SalesOrderDetail AS d
  ON h.SalesOrderID = d.SalesOrderID;'

PRINT @sql;
-- EXEC sp_executesql @sql;

结果:

SELECT 
    h.[SalesOrderID],
    d.[SalesOrderDetailID],
    d.[CarrierTrackingNumber],
    d.[OrderQty],
    d.[ProductID],
    d.[SpecialOfferID],
    d.[UnitPrice],
    d.[UnitPriceDiscount],
    d.[LineTotal],
    h.[rowguid],
    h.[ModifiedDate],
    h.[RevisionNumber],
    h.[OrderDate],
    h.[DueDate],
    h.[ShipDate],
    h.[Status],
    h.[OnlineOrderFlag],
    h.[SalesOrderNumber],
    h.[PurchaseOrderNumber],
    h.[AccountNumber],
    h.[CustomerID],
    h.[SalesPersonID],
    h.[TerritoryID],
    h.[BillToAddressID],
    h.[ShipToAddressID],
    h.[ShipMethodID],
    h.[CreditCardID],
    h.[CreditCardApprovalCode],
    h.[CurrencyRateID],
    h.[SubTotal],
    h.[TaxAmt],
    h.[Freight],
    h.[TotalDue],
    h.[Comment] 
  FROM Sales.SalesOrderHeader AS h
  INNER JOIN Sales.SalesOrderDetail AS d
  ON h.SalesOrderID = d.SalesOrderID;