2016-05-18 2 views
0

私は履歴値を持つテーブルを持ち、いくつかはすべての値がnullの列を持っています。すべての値がnullのすべての列を削除しようとしています。このデータセットでは、ヌル値は「..」で表され、733のレコードがあります。Access 2016クエリの条件に基づいて未知の列名を返す方法

私の問題は、未知の列名を参照する方法を知らないことです。以下のクエリは、カラムを削除する前に正しい情報を選択できるかどうかを特定する最新の試みです。

SELECT *, COUNT(*) 
FROM table 
WHERE * = ".." 

誰でもアイデアはありますか?

+0

"データセット"とは何かわかりません - 1つのテーブル(手動で各列を手動でクエリするのが最も高速です)または多くのテーブルがありますか? – Andre

+0

テーブルが1つ。私は各列を照会するだろうが、私はそこに100列以上のより速い解決策があることを望んでいた。 – Salviati

答えて

0

SQLを使用してこのタスクを実行することはできません。フィールドセットをループすることにより、レコードセットを開いて各レコードのすべての列をテストできます。

レコードが733個ある場合、最も簡単な方法は、アクセス時にテーブルを開き、すべての列を選択し、昇順にソートすることです。空の行が最初に表示されます。それらを手動で削除してください。

0

いや...ただ一つの列が何かだけであるレコードを返すことはできません。'..'の値です。列を照会する必要があります。

何か

Select ' 
    count(*), 
    sum(iif(f1='..',1,0)), 
    sum(iif(f2='..',1,0)), 
    ... 
FROM table 

と列のいずれかが合計と一致するかどうかを見るように、あなたはで動作するように列を持っています。

1

Olivierが書いたように、SQLだけではそれができません。最も簡単な方法は、フィールドコレクションをループし、各フィールドで[field name] <> '..'のような基準を使用してのみ'..'という列を見つけることです。

Sub AnalyzeTable() 

    Dim db As DAO.Database 
    Dim td As DAO.TableDef 
    Dim fld As DAO.Field 
    Dim sCrit As String 
    Dim n As Long 

    Set db = CurrentDb 
    Set td = db.TableDefs("tHistorical") 
    For Each fld In td.Fields 
     ' only check text columns 
     If fld.Type = dbText Or fld.Type = dbMemo Then 
      ' For each field, count the records *not* containing '..' 
      sCrit = "[" & fld.Name & "] <> '..'" 
      n = DCount("*", "tHistorical", sCrit) 
      ' if that number is 0, the column only contains '..' and can go 
      If n = 0 Then 
       ' this will go into the Immediate window, use Ctrl+G to open it 
       Debug.Print fld.Name 
      End If 
     End If 
    Next fld 

End Sub 
関連する問題