2017-08-01 75 views
0

有沒有辦法只選擇名稱不在另一個表上的列?例如選擇名稱不在另一個表中的列

Table A       Column B 
ID | Name | Address   Address 
----------------------- 
1 | Daniel | dummy 

在這個例子中我的select語句應該是這樣的:

select ID, Name from Column A 

我見過人們談論的動態SQL,但我無法找到一個體面的例子來解決我的問題,任何幫助深表感謝。

+0

爲什麼你需要這個? –

+0

列B是配置列。我正在處理大量的文件導出系統,並且允許用戶插入要從文件中排除的列。因此需要動態讀取表A中所需的列(那些用戶沒有排除的列)。不幸的是,我不能在文件導出系統上做一個過濾器,因爲它已經成立。 –

+2

您還沒有使用數據庫進行標記。我們無法讀懂你的想法。 –

回答

2

這裏,你會做到這一點使用動態SQL的方式的版本:

declare @cols varchar(max); 
set @cols = NULL; 

select @cols = coalesce(@cols + ', ' + column_name, column_name) 
from information_schema.columns ca 
where ca.table_name = 'A' and 
     ca.column_name not in (select cb.column_name 
          from information_schema.columns cb 
          where cb.table_name = 'B' 
          ); 

declare @sql varchar(max); 
set @sql = 'select [cols] from A'; 
set @sql = replace(@sql, '[cols]', @cols); 

exec sp_executesql @sql; 

這是一個有點簡單化,顯示information_schema表是如何被起訴。它在很多情況下都能正常工作,但並不是最普通的:

  • 它不考慮模式名稱。
  • 它假設所有名稱都是簡單的ASCII。
  • 它不會轉義列名稱(假設名稱不需要轉義)。
0

選擇WHERE子句中的其他表。

SELECT ID, NAME 
FROM ColumnA 
WHERE NAME NOT IN (SELECT NAME FROM COLUMNB) 
+0

我不認爲這是OP想要的。我認爲OP希望選擇'ID'和'NAME'列,不包括'ADDRESS',因爲'ADDRESS'出現在另一個表中。 –

+0

我想你錯過了我,我期望的結果是@TimBiegeleisen如何解釋。 –

相關問題