{"id":6759,"date":"2026-07-12T02:07:21","date_gmt":"2026-07-12T10:07:21","guid":{"rendered":"https:\/\/www.gudusoft.com\/teradata-data-lineage\/"},"modified":"2026-07-12T02:07:21","modified_gmt":"2026-07-12T10:07:21","slug":"teradata-data-lineage","status":"publish","type":"page","link":"https:\/\/www.gudusoft.com\/es\/teradata-data-lineage\/","title":{"rendered":"Teradata Data Lineage: Column Lineage for Migrations and Compliance"},"content":{"rendered":"<p><strong>Teradata data lineage<\/strong> is the column-level map of how data moves through a Teradata estate: which source columns feed each target table, view, and report, and through which joins, expressions, and <code>QUALIFY<\/code> filters along the way. <strong>Flujo de SQL de Gudu<\/strong> builds that map automatically by parsing your Teradata SQL with a dedicated Teradata dialect parser, one of 39 dialect-specific parsers it ships, and renders it as an interactive, drillable diagram with JSON, CSV, and PNG export plus a REST API.<\/p>\n\n\n\n<div class=\"wp-block-group alignfull has-background is-layout-constrained\" style=\"background-color:#eef7fb;padding-top:24px;padding-bottom:24px\"><div class=\"wp-block-group__inner-container\">\n\n<p><strong>Try it now:<\/strong> paste any Teradata query into the <a href=\"https:\/\/sqlflow.gudusoft.com\/?utm_source=gudusoft&amp;utm_medium=website&amp;utm_campaign=teradata-data-lineage\" target=\"_blank\" rel=\"noreferrer noopener\">free SQLFlow lineage visualizer<\/a>, select the Teradata dialect, and get a column-level lineage diagram in seconds. The Cloud edition has a free tier.<\/p>\n\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Why Teradata data lineage needs a Teradata parser<\/h2>\n\n\n\n<p>Teradata SQL is not ANSI SQL with a different logo. A typical estate that has been running since the BTEQ era carries decades of dialect-specific constructs: <code>SET<\/code> y <code>MULTISET<\/code> table definitions, <code>QUALIFY<\/code> clauses filtering on window functions, named period columns, and scripts written long before anyone thought a machine would ever need to re-read them. A generic ANSI grammar fails on exactly these statements, and every statement a lineage tool fails to parse is a hole in your lineage graph.<\/p>\n\n\n\n<p>SQLFlow takes the opposite approach. It is built on the <a href=\"https:\/\/www.sqlparser.com\/\">General SQL Parser<\/a>, a commercial SQL compiler front-end developed since the mid-2000s and validated against roughly 13,600 per-dialect test fixtures. Its Teradata parser handles BTEQ-era SQL, <code>SET<\/code>\/<code>MULTISET<\/code> tables, <code>QUALIFY<\/code>, and named periods as first-class Teradata syntax, then resolves every column reference through CTEs, subqueries, views, and <code>SELECT *<\/code> expansion before extracting source-to-target relationships at column granularity.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A worked example: tracing a QUALIFY dedup<\/h2>\n\n\n\n<p>El <code>QUALIFY ROW_NUMBER()<\/code> deduplication insert is one of the most common patterns in Teradata warehouses, and a reliable way to break lineage tools that only speak ANSI:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO dw.customer_dim (customer_id, full_name, risk_rating)\nSELECT src.customer_id,\n       TRIM(src.first_nm) || ' ' || TRIM(src.last_nm) AS full_name,\n       src.risk_rating\nFROM   staging.customer_feed src\nQUALIFY ROW_NUMBER() OVER (\n          PARTITION BY src.customer_id\n          ORDER BY src.load_ts DESC) = 1;<\/code><\/pre>\n\n\n\n<p>Run this through SQLFlow and the diagram shows two distinct kinds of relationship:<\/p>\n\n\n\n<ul><li><strong>Direct lineage:<\/strong> <code>dw.customer_dim.full_name<\/code> is derived from <code>staging.customer_feed.first_nm<\/code> y <code>last_nm<\/code> through <code>TRIM<\/code> and concatenation; <code>customer_id<\/code> y <code>risk_rating<\/code> pass through unchanged.<\/li>\n<li><strong>Indirect (impact) lineage:<\/strong> <code>load_ts<\/code> never lands in the target, but it decides which row survives the dedup. SQLFlow records it \u2014 along with <code>customer_id<\/code> in its <code>PARTITION BY<\/code> role \u2014 as an indirect dependency, toggleable separately in the diagram.<\/li><\/ul>\n\n\n\n<p>That indirect layer matters. If someone changes the grain of <code>load_ts<\/code>, the dedup silently starts keeping different rows, and no purely direct lineage graph would warn you. Most competing tools do not model indirect lineage at all; SQLFlow treats it as a distinct relationship type.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Use case 1: regulatory lineage for banks on Teradata<\/h2>\n\n\n\n<p>Teradata has a deep installed base in banking, and banks carry the heaviest lineage obligations. BCBS 239 expects institutions to demonstrate the accuracy and integrity of risk data aggregation; in practice, that means showing auditors exactly which source fields flow into each regulatory figure and through which transformations. Column-level lineage is that evidence; table-level lineage is an approximation auditors increasingly push back on.<\/p>\n\n\n\n<p>Hand-maintained lineage spreadsheets fail this test the day after they are written. SQLFlow instead derives lineage from the SQL itself: point it at your Teradata DDL, view definitions, and load scripts, and it produces column-level provenance for every regulated output \u2014 refreshable on every change through incremental scans, with a persistent lineage repository behind it.<\/p>\n\n\n\n<p>Two properties make this workable inside a bank&#8217;s control environment. First, SQLFlow performs static analysis of SQL code only \u2014 it never reads row data, so no customer records are touched. Second, the <a href=\"https:\/\/www.gudusoft.com\/es\/version-local-de-sqlflow\/\">On-Premise edition<\/a> runs on Docker or Kubernetes entirely inside your network, including air-gapped environments, so not even the SQL text leaves your infrastructure. Enterprise deployments batch-scan estates of 100+ databases and over a million columns, and export adapters for DataHub, Microsoft Purview, and OpenMetadata feed the lineage into whatever catalog your governance team already runs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Use case 2: migrating off Teradata with the true dependency map<\/h2>\n\n\n\n<p>Most Teradata lineage projects today start with a migration: the estate is moving to Snowflake, BigQuery, or Databricks, and someone has to answer what actually depends on what. Guessing from table names and tribal knowledge is how migrations blow their timelines. The dependency map should come from the SQL:<\/p>\n\n\n\n<ul><li><strong>Scope honestly.<\/strong> Column-level lineage shows which columns feed downstream reports and which are dead weight \u2014 logic nothing consumes that you can decommission instead of migrating.<\/li>\n<li><strong>Sequence migration waves.<\/strong> The lineage graph exposes the real dependency order between subject areas, so you move upstream feeds before the marts that consume them.<\/li>\n<li><strong>Catch dialect traps.<\/strong> Constructs like <code>QUALIFY<\/code>, <code>SET<\/code> table dedup semantics, and named periods all need deliberate translation. Lineage tells you where each construct sits in the dataflow and what is downstream if the translation is wrong.<\/li>\n<li><strong>Verify after cutover.<\/strong> Because SQLFlow parses both dialects, you can generate <a href=\"https:\/\/www.gudusoft.com\/es\/linaje-de-datos-de-copos-de-nieve\/\">Snowflake lineage<\/a> from the rewritten SQL and compare it against the Teradata baseline \u2014 same targets, same source columns, or you have a translation bug.<\/li><\/ul>\n\n\n\n<p>The same before-and-after workflow applies to other legacy MPP retirements \u2014 see the <a href=\"https:\/\/www.gudusoft.com\/es\/netezza-data-lineage\/\">Netezza data lineage<\/a> page for the decommissioning variant, and the <a href=\"https:\/\/www.gudusoft.com\/es\/herramienta-de-linaje-de-datos-de-oracle\/\">Linaje de datos de Oracle<\/a> page if your estate mixes Teradata with Oracle sources.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How SQLFlow ingests a Teradata estate<\/h2>\n\n\n\n<p>You can feed SQLFlow Teradata SQL at whatever scale you are working at:<\/p>\n\n\n\n<ul><li><strong>Paste a query<\/strong> into the browser for a quick trace of one statement.<\/li>\n<li><strong>Upload files<\/strong> \u2014 DDL exports, view definitions, ETL and load scripts \u2014 for a project-sized analysis.<\/li>\n<li><strong>Connect over JDBC<\/strong> to pull schema metadata and object definitions directly from Teradata.<\/li>\n<li><strong>Automate<\/strong> with the headless CLI or REST API to keep lineage refreshed as part of your deployment pipeline, and export results as JSON or CSV for anything custom.<\/li><\/ul>\n\n\n\n<p>For the full picture of what the engine does across all 39 dialects \u2014 direct versus indirect lineage, ER diagram inference from DDL, dbt support, the AI lineage query \u2014 see the <a href=\"https:\/\/www.gudusoft.com\/es\/sql-data-lineage-tool\/\">SQL data lineage tool<\/a> pillar page.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What about open-source and catalog tools?<\/h2>\n\n\n\n<p>Open-source parsers like <code>sqllineage<\/code> y <code>sqlglot<\/code> are genuinely useful for extracting lineage from individual, mostly-ANSI statements, and catalog-first platforms are good at organizing metadata and ownership across an organization. The gap for Teradata specifically is depth of dialect coverage: decades-old BTEQ-era scripts, <code>QUALIFY<\/code>-heavy dedup logic, and vendor-specific DDL are precisely where generic grammars stop parsing. If you are evaluating tools for a Teradata estate, the test is simple: run your ugliest production load script through each candidate and count the statements that come back with complete column-level lineage.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deployment options and pricing<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Edition<\/th><th>Best for<\/th><th>Precios<\/th><\/tr><\/thead><tbody>\n<tr><td>Nube SQLFlow<\/td><td>Trying Teradata lineage today; individual analysis work<\/td><td>Free tier; premium $49.99\/month<\/td><\/tr>\n<tr><td>SQLFlow local<\/td><td>Banks and regulated estates \u2014 SQL never leaves your network; air-gapped supported<\/td><td>$500\/month or $4,800 one-time per database type, installable on two servers<\/td><\/tr>\n<tr><td>REST API \/ CLI \/ Java library<\/td><td>Embedding lineage into pipelines and platforms<\/td><td>See the pricing page<\/td><\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p>Additional database types on On-Premise are +$100\/month or +$1,000 one-time each, which matters mid-migration when you need Teradata and Snowflake analyzed side by side. Full details on the <a href=\"https:\/\/www.gudusoft.com\/es\/precios\/\">pricing page<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently asked questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Does SQLFlow understand Teradata-specific syntax like QUALIFY and SET\/MULTISET tables?<\/h3>\n\n\n<p>Yes. SQLFlow uses a dedicated Teradata dialect parser, not a generic ANSI grammar. BTEQ-era SQL, <code>SET<\/code>\/<code>MULTISET<\/code> table definitions, <code>QUALIFY<\/code> clauses, and named periods are all parseable as Teradata SQL, so lineage extraction covers the statements a generic parser rejects.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can SQLFlow help with a Teradata-to-Snowflake or BigQuery migration?<\/h3>\n\n\n<p>Yes. Analyze the Teradata estate first to get the true column-level dependency map: what to migrate, what to retire, and in what order. Because Snowflake and BigQuery are also among SQLFlow&#8217;s 39 dialects, you can analyze the rewritten SQL after cutover and compare lineage against the Teradata baseline to verify the translation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does SQLFlow read data from our Teradata tables?<\/h3>\n\n\n<p>No. SQLFlow performs static analysis of SQL code and optionally reads schema metadata such as table and column definitions. It never queries row data. With On-Premise, even the SQL text stays inside your network.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can lineage run fully inside our network for compliance?<\/h3>\n\n\n<p>Yes. SQLFlow On-Premise deploys on Docker or Kubernetes inside your infrastructure, including air-gapped environments, at $500\/month or $4,800 one-time per database type. It scales to estates of 100+ databases and over a million columns, with incremental scans and export adapters for DataHub, Microsoft Purview, and OpenMetadata.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What Teradata inputs does SQLFlow accept?<\/h3>\n\n\n<p>Pasted SQL, uploaded files (DDL, views, load scripts), and live schema metadata pulled over JDBC. Results are available as interactive diagrams, JSON, CSV, PNG, or through the REST API.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Is column-level lineage enough for BCBS 239?<\/h3>\n\n\n<p>Column-level lineage is the technical evidence layer: it documents which source fields feed each risk figure and through which transformations, including indirect dependencies from filters and join conditions. Your compliance program defines the full scope; SQLFlow keeps the lineage layer accurate and automatically refreshed instead of hand-maintained.<\/p>\n\n\n\n<div class=\"wp-block-group alignfull has-background is-layout-constrained\" style=\"background-color:#60d5f6;padding-top:32px;padding-bottom:32px\"><div class=\"wp-block-group__inner-container\">\n\n<h2 class=\"wp-block-heading\">Trace your Teradata lineage now<\/h2>\n\n\n<p>Paste a Teradata query into the free visualizer, or talk to us about scanning a full estate before your audit or migration.<\/p>\n\n\n<div class=\"wp-block-buttons is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/sqlflow.gudusoft.com\/?utm_source=gudusoft&amp;utm_medium=website&amp;utm_campaign=teradata-data-lineage\" target=\"_blank\" rel=\"noreferrer noopener\">Try SQLFlow free<\/a><\/div>\n<\/div>\n\n\n<div class=\"wp-block-buttons is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.gudusoft.com\/es\/contacto\/\">Request an enterprise demo<\/a><\/div>\n<\/div>\n\n<\/div><\/div>\n\n\n\n<script type=\"application\/ld+json\">{\n    \"@context\": \"https:\\\/\\\/schema.org\",\n    \"@graph\": [\n        {\n            \"@type\": \"SoftwareApplication\",\n            \"name\": \"Gudu SQLFlow\",\n            \"applicationCategory\": \"DeveloperApplication\",\n            \"applicationSubCategory\": \"SQL Data Lineage Tool\",\n            \"operatingSystem\": \"Web, Linux, Windows, macOS\",\n            \"url\": \"https:\\\/\\\/www.gudusoft.com\\\/teradata-data-lineage\\\/\",\n            \"description\": \"Automated Teradata data lineage tool with a dedicated Teradata dialect parser: column-level lineage from BTEQ-era SQL, QUALIFY clauses, and SET\\\/MULTISET tables for BCBS 239 compliance and Snowflake\\\/BigQuery migrations.\",\n            \"featureList\": \"Teradata dialect parser, column-level lineage, indirect\\\/impact lineage, QUALIFY and named-period support, JDBC metadata ingestion, incremental estate scanning, DataHub\\\/Purview\\\/OpenMetadata export, REST API\",\n            \"softwareVersion\": \"8.2.3\",\n            \"offers\": [\n                {\n                    \"@type\": \"Offer\",\n                    \"name\": \"SQLFlow Cloud Free\",\n                    \"price\": \"0\",\n                    \"priceCurrency\": \"USD\"\n                },\n                {\n                    \"@type\": \"Offer\",\n                    \"name\": \"SQLFlow Cloud Premium\",\n                    \"price\": \"49.99\",\n                    \"priceCurrency\": \"USD\",\n                    \"priceSpecification\": {\n                        \"@type\": \"UnitPriceSpecification\",\n                        \"price\": \"49.99\",\n                        \"priceCurrency\": \"USD\",\n                        \"billingIncrement\": 1,\n                        \"unitText\": \"MONTH\"\n                    }\n                },\n                {\n                    \"@type\": \"Offer\",\n                    \"name\": \"SQLFlow On-Premise\",\n                    \"price\": \"4800\",\n                    \"priceCurrency\": \"USD\"\n                }\n            ],\n            \"publisher\": {\n                \"@type\": \"Organization\",\n                \"name\": \"Gudu Software\",\n                \"url\": \"https:\\\/\\\/www.gudusoft.com\\\/\"\n            }\n        },\n        {\n            \"@type\": \"FAQPage\",\n            \"mainEntity\": [\n                {\n                    \"@type\": \"Question\",\n                    \"name\": \"Does SQLFlow understand Teradata-specific syntax like QUALIFY and SET\\\/MULTISET tables?\",\n                    \"acceptedAnswer\": {\n                        \"@type\": \"Answer\",\n                        \"text\": \"Yes. SQLFlow uses a dedicated Teradata dialect parser, not a generic ANSI grammar. BTEQ-era SQL, SET\\\/MULTISET table definitions, QUALIFY clauses, and named periods are all parseable as Teradata SQL, so lineage extraction covers the statements a generic parser rejects.\"\n                    }\n                },\n                {\n                    \"@type\": \"Question\",\n                    \"name\": \"Can SQLFlow help with a Teradata-to-Snowflake or BigQuery migration?\",\n                    \"acceptedAnswer\": {\n                        \"@type\": \"Answer\",\n                        \"text\": \"Yes. Analyze the Teradata estate first to get the true column-level dependency map: what to migrate, what to retire, and in what order. Because Snowflake and BigQuery are also among SQLFlow's 39 dialects, you can analyze the rewritten SQL after cutover and compare lineage against the Teradata baseline to verify the translation.\"\n                    }\n                },\n                {\n                    \"@type\": \"Question\",\n                    \"name\": \"Does SQLFlow read data from our Teradata tables?\",\n                    \"acceptedAnswer\": {\n                        \"@type\": \"Answer\",\n                        \"text\": \"No. SQLFlow performs static analysis of SQL code and optionally reads schema metadata such as table and column definitions. It never queries row data. With On-Premise, even the SQL text stays inside your network.\"\n                    }\n                },\n                {\n                    \"@type\": \"Question\",\n                    \"name\": \"Can lineage run fully inside our network for compliance?\",\n                    \"acceptedAnswer\": {\n                        \"@type\": \"Answer\",\n                        \"text\": \"Yes. SQLFlow On-Premise deploys on Docker or Kubernetes inside your infrastructure, including air-gapped environments, at $500\\\/month or $4,800 one-time per database type. It scales to estates of 100+ databases and over a million columns, with incremental scans and export adapters for DataHub, Microsoft Purview, and OpenMetadata.\"\n                    }\n                },\n                {\n                    \"@type\": \"Question\",\n                    \"name\": \"What Teradata inputs does SQLFlow accept?\",\n                    \"acceptedAnswer\": {\n                        \"@type\": \"Answer\",\n                        \"text\": \"Pasted SQL, uploaded files (DDL, views, load scripts), and live schema metadata pulled over JDBC. Results are available as interactive diagrams, JSON, CSV, PNG, or through the REST API.\"\n                    }\n                },\n                {\n                    \"@type\": \"Question\",\n                    \"name\": \"Is column-level lineage enough for BCBS 239?\",\n                    \"acceptedAnswer\": {\n                        \"@type\": \"Answer\",\n                        \"text\": \"Column-level lineage is the technical evidence layer: it documents which source fields feed each risk figure and through which transformations, including indirect dependencies from filters and join conditions. Your compliance program defines the full scope; SQLFlow keeps the lineage layer accurate and automatically refreshed instead of hand-maintained.\"\n                    }\n                }\n            ]\n        }\n    ]\n}<\/script>","protected":false},"excerpt":{"rendered":"<p>Teradata data lineage is the column-level map of how data moves through a Teradata estate: which source columns feed each target table, view, and report, and through which joins, expressions, and QUALIFY filters along the way. Gudu SQLFlow builds that map automatically by parsing your Teradata SQL with a dedicated Teradata dialect parser, one of 39 dialect-specific parsers it ships, and renders it as an interactive, drillable diagram with JSON, CSV, and PNG export plus a REST API. Try it now: paste any Teradata query into the free SQLFlow lineage visualizer, select the Teradata dialect, and get a column-level lineage\u2026<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":5}},"_links":{"self":[{"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/pages\/6759"}],"collection":[{"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/comments?post=6759"}],"version-history":[{"count":0,"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/pages\/6759\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/media?parent=6759"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}