Esta pode ser uma pergunta um pouco estranha:
O modelo de dados do nosso projeto tem várias tabelas com várias colunas, qualquer uma das quais pode ser usada para se juntar a uma tabela de configuração. A questão aqui é como obter o nome da coluna que foi usada para se conectar à tabela de configuração em uma junção OR?
Por exemplo, digamos que a consulta tenha esta aparência:
SELECT FIRST.ID, SEC.ID, TRD.ID, FRTH.ID, SETS.ID, SETS.VALUE
FROM ROOTTABLE FIRST
LEFT JOIN SECONDTABLE SEC ON SEC.SECDONTABLE_ID = FIRST.SECONDTABLE_ID
LEFT JOIN THIRDTABLE TRD ON TRD.THIRDTABLE_ID = FIRST.THIRDTABLE_ID
LEFT JOIN FOURTHTABLE FRTH ON FRTH.FOURTHTABLE_ID = TRD.FOURTHTABLE_ID
-- etc...
LEFT JOIN SETTINGTABLE SETS
ON (SETS.ID = FIRST.ONESETTING_ID OR SETS.ID = FIRST.SECONDSETTING_ID
OR SETS.ID = FIRST.THIRDSETTING_ID OR SETS.ID = TRD.RANDSETTING_ID
OR SETS.ID = FRTH.ONESETTING_ID
-- etc...
)
Agora, esse é um exemplo muito analisado do que realmente está acontecendo. Podemos ter dezenas de tabelas com várias colunas joinin em cada uma delas para o SETTINGTABLE.
Obviamente, simplesmente fazer uma junção separada para cada table.column mostraria a coluna usada. Ou, alternativamente, você pode usar a cláusula CASE no select. Mas qualquer um deles é complicado e requer muita entrada manual. Mesmo apenas usando todas as colunas de ID de junção no select permitiria que você comparasse os IDs, mas como os resultados precisam ser lidos por pessoas não técnicas, isso não ajudaria muito.
Então, existe uma maneira de usar alguns objetos sys ou algo assim para simplesmente retornar o nome da coluna que foi realmente usado para conectar-se a SETTINGTABLE? O design é o que é e não mudará. Então, estou simplesmente tentando encontrar a melhor maneira de trabalhar com o que temos. Isso aceleraria significativamente nosso diagnóstico de alguns de nossos scripts, consultas e dados.
Obrigado!
Não há nenhum
sys
objeto ou DMV que lhe dê tais informações. Você terá que construí-lo sozinho, para o qual você pode dar uma olhada no exemplo abaixo.Vamos preparar algumas tabelas e dados fictícios.
Aqui está a consulta com a coluna MATCHES para mostrar de onde a condição JOIN foi atendida (SETS.ID = ?).
Observe que coloquei as fontes que poderiam fazer a correspondência (1-5) no
VALUES
construtor de linhas e nasON
cláusulas para que você possa seguir o padrão.Resultados:
Algumas coisas a serem observadas:
OR
s no JOIN significam queSETS.ID
podem ser correspondidos por qualquer uma das fontes - a consulta mostra todos eles separados por vírgulas.(1, 1, 1, 5)
iniciais correspondem a SETS.ID três vezes.SQL Fiddle
Para maior clareza, este outro SQL Fiddle mostra as
*SETTING_ID
colunas adicionais usadas para corresponder ao SETS.ID.